前端最好用的方法之一Promise

107 阅读1分钟

本文已参与「 新人创作礼 」活动,一起开启掘金创作之路

关于如何进行图片优化 - 适合的才是最好的

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:写文章也是一件有趣味的事情,既是梳理丰富的笔记,也是磨砺的一种方法。