《深入理解ES6》阅读随笔
对于 Promise 中的一些基础概念,需要了解一下:
Promise 的生命周期
Promise 没有用到事件模型和回调机制,它是一个类似占位符的对象。Promise 在创建以后,会有三个状态,刚创建是 pending ,成功执行以后变更为 fulfilled,执行失败之后改变为 rejected。这些状态均不可通过编程的方式拿取到,而是在 promise 的返回对象中通过 then 的方式捕获。
凡是可以通过 then 方式获取状态的对象都称之为 thenable 对象,thenable 对象不一定都是由 promise 返回,但 promise 返回的却都是 thenable 对象。then 中有两个参数,第一个参数的位置用于放置监听执行成功的回调函数,第二个参数的位置用于放置监听执行失败的回调函数。就像下面一样:
// 这里先假设这是一个 promise 对象,后面会有具体实现 code
const readfile1 = readfile()
readfile1.then(function (data) {
console.log('success:', data)
}, function (err) {
console.log('err', err)
})
另外 promise 还有一个 catch 方法,用于返回执行失败的结果,等价于 then 中的第二个参数 :
const readfile1 = readfile()
readfile1.catch(function (err) {
console.log('err', err)
})
// 上面实现等价于
readfile1.then(_, function (err) {
console.log('err', err)
})
创建未执行的 Promise
在构造 promise 对象时会创建一个构造器,构造器中有两个参数,第一个参数 resolve 放在运行成功的代码后面执行,通知执行成功;第二个参数 reject 放在运行失败的代码后面执行,通知执行失败。
// 利用 nodejs 中的异步文件读取方法来模拟
const fs = require('fs')
const readfile = function (name) {
return new Promise((resolve, reject) => {
const err = false
fs.readFile(name, { encoding: 'utf-8' }, function (err, data) {
if (err) {
reject('no file')
}
resolve(data)
})
})
}
readfile('test1.txt').then(function (data) {
console.log('success:', data)
}, function (err) {
console.log('err', err)
})
console.log('begin...')
// 如果 test1.txt 文件存在,且也在当前目录下,则返回文本内容,否则返回错误,先输出 begin...
创建已处理的 Promise
Promise 除了在创建构造函数时,会在构造器中有 resolve 和 reject 两个参数外,还可以直接通过调用静态方法的方式调用 resolve 和 reject,用于直接创建已处理的 promise:
const pro1 = Promise.resolve(100)
const pro2 = Promise.reject(200)
pro1.then(function (data) {
console.log('success:', data)
})
pro2.catch(function (err) {
console.log('err:', err)
})
console.log('begin...')
// 执行结果:
// begin...
// success: 100
// err: 200
错误捕捉
当 promise 中出现错误时,可以通过 catch 的方式将错误捕捉到:
const pro1 = new Promise(function (resolve, reject) {
throw new Error('err');
});
pro1.catch(function (error) {
console.log(error);
});
网友评论