Promise中then的链式回调

原创 守候你的季节 随笔 JavaScript 94阅读 2019-01-16 23:16:37 举报

看题!

结果为:

总结:

  1. Promise.prototype.then()返回的是一个新的Promise实例(注意,不是原来那个Promise实例)。因此可以采用链式写法,即then方法后面再调用另一个then方法。
  2. then方法中若有显式 return 一个新的 promise(包括fullfilled和rejected)则显示执行。若无显式指定,则隐式触发新promise的pending->fullfilled状态变更,进入下一个thenfullfilled回调。
  3. Promise.prototype.catch()方法是.then(null, rejection).then(undefined, rejection)的别名,用于指定发生错误时的回调函数,所以catch同样返回一个新的promise,若没有显示指定,便执行隐式操作。

建议:

  • 不要在then方法里面定义 Reject 状态的回调函数(即then的第二个参数),总是使用catch方法。

以上留有歧义者欢迎指出!

参考资料:
PromiseA+ 规范地址
中文翻译PromiseA+ 规范
解读Promise内部实现原理

这里也结合promise提一下 event loop,JavaScript执行流程由函数调用栈与异步队列(宏任务与微任务组成)。

注意这里 macrotask microtask 分别表示异步任务的两种分类。js运行过程中,JS 引擎会将所有任务按照类别分到两个队列中,首先在 macrotask 的队列(也叫 task queue)中取出第一个任务,执行完毕后取出 microtask 队列中的所有任务顺序执行;之后再取 macrotask 任务,周而复始,直至两个队列的任务都取完。(任务的执行都是在函数调用栈中完成的)。

上一个例子:

结果:

其中chrome中,setImmediate优先于setTimeout执行

评论 ( 0 )
最新评论
暂无评论

赶紧努力消灭 0 回复