乐趣区

关于javascript:图解Promise

作者: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

退出移动版