在 ES6 中新增了一个 API:Promise
,Promise 是一个构造函数。
Promise 容器 图解:
Pending:正在执行;Resolved:成功;Rejected:失败。
⚠️ Promise 本身不是异步,但是里面的任务是异步:
使用:
var fs = require("fs")
// 创建 Promise 容器
// Promise 容器一旦创建,就开始执行里面的代码
var p1 = new Promise(function (resolve, reject) {
fs.readFile("xxx.js", "utf-8", function (err, data) {
if (err) {
// Pending --> Rejected 失败
// 这里调用的 reject 方法实际上就是 then 方法的第二个参数函数
reject(err)
} else {
// Pending --> Resolved 成功
// 这里调用的 resolve 方法实际上就是 then 方法传递的第一个 function
resolve(data)
}
})
})
// 当 p1(Promise) 成功了 然后(then)进行指定的操作
// then 方法接收的 function 就是容器中的 resolve 函数
p1.then(function (data) {
console.log(data)
}, function (err) {
console.log('读取文件失败了', err)
})
.then() 的链式调用:
图解:
var fs = require("fs")
var p1 = new Promise(function (resolve, reject) {
fs.readFile("xxx.js", "utf-8", function (err, data) {
if (err) {
reject(err)
} else {
resolve(data)
}
})
})
var p2 = new Promise(function (resolve, reject) {
fs.readFile("4.js", "utf-8", function (err, data) {
if (err) {
reject(err)
} else {
resolve(data)
}
})
})
p1
.then(function (data) {
console.log(data)
return p2
}, function (err) {
console.log('读取文件xxx失败了', err)
})
.then(function (data) {
console.log(data)
}, function (err) {
console.log('读取文件4失败了', err)
})
封装 Promise 版本的 readFile:
var fs = require("fs")
function pReadFile(filePath) {
return new Promise(function (resolve, reject) {
fs.readFile(filePath, "utf-8", function (err, data) {
if (err) {
reject(err)
} else {
resolve(data)
}
})
})
}
pReadFile("xxx.js")
.then(function (data) {
console.log(data)
return pReadFile("4.js")
})
.then(function (data) {
console.log(data)
})