本文已参与「 新人创作礼 」活动,一起开启掘金创作之路
Promise 作为前端最好用的方法之一。
在没有promise之前,我们经典用法就是callback。其实callback也没有什么不好,但是业务足够复杂的场景的时候,callback的深层嵌套会让你对眼前的代码在往后的岁月无法维护。这个时候promise就起到的关键的作用。
promise做为最牛逼的异步解决方案,近2年中前端很多场景都得到了广泛的应用。
至于发最为常用的api,有all 、race、allSettled
等等应用。
例如我们如何自己实现一个:
Promise.all = function(promises) {
return new Promise(function(resolve, reject) {
var resolvedCounter = 0
var promiseNum = promises.length
var resolvedValues = new Array(promiseNum)
for (var i = 0; i < promiseNum; i++) {
(function(i) {
Promise.resolve(promises[i]).then(function(value) {
resolvedCounter++
resolvedValues[i] = value
if (resolvedCounter == promiseNum) {
return resolve(resolvedValues)
}
}, function(reason) {
return reject(reason)
})
})(i)
}
})
}
这里不是要说的不是内置api。
而是自己如何来实现。
这里通过一个计数器来记录执行的次数。
还有race
Promise.race = function(promises) {
return new Promise(function(resolve, reject) {
for (var i = 0; i < promises.length; i++) {
Promise.resolve(promises[i]).then(function(value) {
return resolve(value)
}, function(reason) {
return reject(reason)
})
}
})
}
这个Race 还是很棒。
## allSettled 返回有序[promise1, promise2] 结果集
Promise.allSettled = function (list) {
if (list instanceof Array) {
let ret = [];
list.forEach((i) => {
ret.push(
new Promise(function (resolve, reject) {
i.then((v) => {
resolve({ state: true, data: v });
}).catch((e) => {
resolve({ state: false, data: e });
});
})
);
});
return Promise.all(ret);
}
return Promise.reject();
};
这几个也是足以说明,es的方法也是不断演变,我们还是要自弃所以然。这个可以当做是学习的参考。
今天先到这里,虽然如此, 我还要坚持日更2个星期。在这次活动之后,我能带来一个系统性的笔记来回馈大家。
日更其实还是有点频繁,特别是技术的严谨都是比较的散乱没有,目前写的比较散乱,后期我准备写写系列性的教程。当然这个是要保持有足够的时间。
PS:写文章也是一件有趣味的事情,既是梳理丰富的笔记,也是磨砺的一种方法。