Promise 概述
Promise 是 JavaScript 中异步编程解决方案,可以解决回调函数方案中的回调地狱问题可以将 Promise 理解为容器,用于包裹异步 API的容器,当容器中的异步 API执行完成后,Promise 允许我们在容器的外面获取异步API的执行结果,从而避免回调函数嵌套。Promise 翻译为承若,表示它承若帮我们做一些事情,既然它承若了它就要去做,做就会有一个过程、就会有一个结果,结果要么是成功要么是失败。
所以在 Promise 中有三种状态,分别为等待(pending),成功(fulfilled),失败(rejected)。默认状态为等待,等待可以变为成功,等待可以变为失败状态一旦更改不可改变,成功不能变回等待,失败不能变回等待,成功不能变成失败,失败不能变成成功。
Promise.all 并发操作
java
Promise.all([
readFile('D:\\work\\jjBest\\0.txt'),
readFile('D:\\work\\jjBest\\1.txt'),
readFile('D:\\work\\jjBest\\2.txt')
]).then(function (res) {
console.log(res)
})
async
// 加上async就是异步函数了
返回值会自动包裹在promise中
java
async function run(){
return "a"
}
java
Promise { 'a' }
await
异步函数关键字 await
await 关键字后面只能放置返回 Promise 对象的 API。
await 关键字可以暂停函数执行,等待 Promise
执行完后返回执行结果 await 关键字只能出现在异步函数中。
java
function readFile(path){
return new Promise(function (resolve, reject) {
fs.readFile(path,'utf-8',function (err, data) {
if (err){
reject(err)
}else {
resolve(data)
}
})
})
}
// 加上async就是异步函数了
async function run(){
let x = await readFile('D:\\work\\jjBest\\0.txt');
console.log(x)
let y = await readFile('D:\\work\\jjBest\\1.txt');
console.log(y)
return [x,y]
}
run().then(function (res) {
console.log(res)
})
promisify
使用promisify后,不用声明readFile的promise函数了。
java
const promisify = require('util').promisify
const readFile = promisify(fs.readFile)
// 加上async就是异步函数了
async function run() {
let x = await readFile('D:\\work\\jjBest\\0.txt', "utf-8");
console.log(x)
let y = await readFile('D:\\work\\jjBest\\3.txt', "utf-8");
console.log(y)
return [x, y]
}
run().then(function (res) {
console.log(res)
}).catch(function (err) {
console.log(err)
})