剑客
关注科技互联网

Array.reduce 实现Promise循环同步

最近有个场景,需要实现Promise的循环同步。

就是需要这样:


Promise.resolve().then(()=>promise1).then(()=>promise2).then(()=>promise3)...

其中promise实例是类似 function promise(value){return later(value)}这样的

我现在需要对于一个数组,执行这样数组长度的串行promise操作。但是很多,很麻烦…

而且对于一个这样的小问题,我也并不想引入一个 async或者q或者bluebird这样非原生Promise的库。

那怎么办?怎么让循环串行起来呢?

利用Array.reduce方法。

arr.reduce(callback[, initialValue])

reduce 函数的callback接受4个参数,分别是previousValue,currentValue,currentIndex,array。

那怎么串行呢?

previousvalue的值可以是一个Promise对象。

我们给reduce的callback函数一个初始值,initialValue设为Promise.resolve()

在每一次callback返回一个Promise对象,而这个对象是对previousValue对象的一个封装,将previousValue.then(()=>promiseInstance)返回,又在下一次的回调函数中,previousValue为上个回调函数的返回值。

如:

Array.from(Array(100))
        .reduce(function(promise, value) {
            return promise.then(function(){
                  return Promise.resolve()
             })
         },Promise.resolve('init'));

如此便能解决 Promise的循环串行问题,而不依赖于非原生的库

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址