对于 JS Promise,我们需要知道些什么
将这个两个材料列出来,可能已经够了
下面列几个要点
创建建一个 Promise 对象
1 | new Promise( function(resolve, reject) {...} /* executor */ ) |
resolve
和reject
函数被调用时,分别将 promise 的状态改为fulfilled(完成)
或rejected(失败)
。
使用的时候,把异步操作放入这个「承诺」里(返回一个 Promsie 对象):
1 | function myAsyncFunction(url) { |
当我们想知道「承诺」的结果时,可以使用 promise.then()
实例方法
1 | promise.then(onFulfilled, onRejected) |
- resolve (成功) 时,
onFulfilled
会被调用 - reject (失败) 时,
onRejected
会被调用
如果只想对异常进行处理,可以采用:
1 | promise.catch(onRejected) |
一个完整的例子
1 | function asyncFunction() { |
Promise.resolve
静态方法
Promise.resolve(value)
可以认为是new Promise()
方法的快捷方式
比如 Promise.resolve(42)
可以认为是以下代码的语法糖:
1 | new Promise(function(resolve){ |
Promise.reject(error)
也是类似的
Promise.prototype.then()
上面我们已经看到过 .then
的使用,它最多需要两个参数,分别是处理「成功」状态和「失败」状态的回调函数
promise chain
.then()
和 .catch()
都会返回一个 Promise 对象,所以可以链式调用
then 的返回
如果传入的 onFulfilled 参数类型不是函数,则会在内部被替换为(x) => x ,即原样返回 promise 最终结果的函数
也就是说 p1(一个 Promise 对象)走到了 then 但没找到相应的处理函数,则直接返回一个带着 p1 终态
的 Promise 对象。
如果 then 里有处理函数 h1,那这个 then 返回值就要看 h1 返回的是什么了
- 如果then中的回调函数返回一个值,那么then返回的Promise将会成为接受状态,并且将返回的值作为接受状态的回调函数的参数值。
- 如果then中的回调函数抛出一个错误,那么then返回的Promise将会成为拒绝状态,并且将抛出的错误作为拒绝状态的回调函数的参数值。
- 如果then中的回调函数返回一个已经是接受状态的Promise,那么then返回的Promise也会成为接受状态,并且将那个Promise的接受状态的回调函数的参数值作为该被返回的Promise的接受状态回调函数的参数值。
- 如果then中的回调函数返回一个已经是拒绝状态的Promise,那么then返回的Promise也会成为拒绝状态,并且将那个Promise的拒绝状态的回调函数的参数值作为该被返回的Promise的拒绝状态回调函数的参数值。
- 如果then中的回调函数返回一个未定状态(pending)的Promise,那么then返回Promise的状态也是未定的,并且它的终态与那个Promise的终态相同;同时,它变为终态时调用的回调函数参数与那个Promise变为终态时的回调函数的参数是相同的。
原文作者: dgb8901,yinxing
原文链接: https://www.itwork.club/2018/11/15/Promise/
版权声明: 转载请注明出处
为您推荐
体验小程序「简易记账」
关注公众号「特想学英语」