作者:HerryLo
博客原文链接
Promises
对象被用于示意一个异步操作的最终实现 (或失败), 及其后果值。次要是为了解决异步操作的问题。
一个 Promise对象有以下三种状态:
pending: 初始状态,既不是胜利,也不是失败状态。fulfilled(resolved): 意味着操作胜利实现。rejected: 意味着操作失败。
Promise对象外部运行的一个变动, 变动如下:
1. 当new Promise()被实例化后,即示意Promise 进入pending初始化状态,准备就绪,期待运行。2. 一旦Promise实例运行胜利或者失败之后,实例状态就会变为fulfilled 或者 rejected,此时状态就无奈变更。
Promise实例流程
Promise实例函数调用流程根本如下图所示:
外部次要就是状态的变动,在状态为padding时,会期待执行,一旦非padding态,就会运行寄存在数组中的函数。
运行代码示例
解决非异步状况:
var p = new Promise(function (resolve, reject) { resolve('Promise');})p.then((result) => { console.log(1)})p.then((result) => { console.log(2)});
先实例化Promise,同时执行完回调函数,状态由pedding 变为 fullilled,Promise实例回调函数执行实现。(此时并不会将then回调函数保留,函数程序执行)
继续执行,保留then回调,发现Promise状态曾经变为fullilled,then回调间接运行。(这里的两个then回调都是这样)
解决异步状况:
var p = new Promise(function (resolve, reject) { setTimeout(()=> { console.log('setTimeout'); resolve('Promise') },1000)})p.then((result) => { console.log(1)})p.then((result) => { console.log(2)});
先实例化Promise,同时执行完回调函数,因为是setTimeout函数,回调函数进入工作队列,状态仍然还是pedding ,Promise实例回调函数执行实现,继续执行其余同步函数。(此时并不会将then回调函数保留)
继续执行,保留then回调,发现Promise状态还是pedding,then回调被保留在数组中,then回调保留结束。执行setTimeout回调函数,执行被保留在数组中的then回调。
提醒:then/catch 都是一个 Promise
这就是Promise的根本运作,有趣味也能够看看 Promise源码解析
参考:
Promise源码
ecma262: Promise Abstract Operations