1. Promise 构造函数是同步还是异步执行, then 呢 ?promise 如何实现 then 处理 ?
Promise 的构造函数是同步执行的. then 是异步执行的.
promise 的 then 实现, 详见: Promise 源码实现
2. Promise 和 setTimeout 的区别 ?
Promise 是微任务, setTimeout 是宏任务, 同一个事件循环中, promise.then 总是先于 setTimeout 执行. 同一个事件循环中, promise.then 先于 setTimeout 执行.
3. 如何实现 Promise.finnally ?
不管成功还是失败, 都会走到 finally 中, 并且 finally 之后, 还可以继续 then. 并且会将值原封不动的传递给后面的 then.
- Promise.prototype.finally = function (callback) {
- return this.then((value) => {
- return Promise.resolve(callback()).then(() => {
- return value;
- });
- }, (err) => {
- return Promise.resolve(callback()).then(() => {
- throw err;
- });
- });
- }
- --------------
- "我自己是一名从事了多年开发的 web 前端老程序员, 目前辞职, 现在在做自己的 Python 私人定制课程, 今年年初我花了一个月整理了一份最适合 2019 年学习的 web 前端学习干货, 从最基础的到各种框架都有整理, 送给每一位想学 web 前端小伙伴, 想要获取的可以添加领取资料企 / 鹅裙: yidian9567,zixun66,604, 即可免费获取."
4. 如何实现 Promise.all ?
要实现 Promise.all, 首先我们需要知道 Promise.all 的功能:
1. 如果传入的参数是一个空的可迭代对象, 那么此 promise 对象回调完成 (resolve), 只有此情况, 是同步执行的, 其它都是异步返回的.
2. 如果传入的参数不包含任何 promise, 则返回一个异步完成. promises 中所有的 promise 都 promise 都 "完成" 时或参数中不包含 promise 时回调完成.
3. 如果参数中有一个 promise 失败, 那么 Promise.all 返回的 promise 对象失败
4. 在任何情况下, Promise.all 返回的 promise 的完成状态的结果都是一个数组
Promise.all = function (promises) { return new Promise((resolve, reject) => { let index = 0; let result = []; if (promises.length === 0) { resolve(result); } else { setTimeout(() => { function processValue(i, data) { result[i] = data; if (++index === promises.length) { resolve(result); } } for (let i = 0; i <promises.length; i++) { //promises[i] 可能是普通值 Promise.resolve(promises[i]).then((data) => { processValue(i, data); }, (err) => { reject(err); return; }); } }) } }); }
来源: http://www.jianshu.com/p/926053386e49