javascript - promise串行封装

查看:138
本文介绍了javascript - promise串行封装的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

想要一个Promise.queue,类似Promise.all,接受一个装了很多个promise对象的数组,但逐个依次决议(不像all一样是并发的,这里想要的是串行一个接一个的完成决议),获得一个结果数组,不考虑参数传递,google了一些答案,感觉都不太满意,求教大家,谢谢

解决方案

明白你的意思了,你要这么实现的话不能传入 Promise,因为在你创建 Promise 的一刻它就开始 pending 等待 settlement 了。

你应该传入一系列的 executors ,等上一个 Promise resolved 之后再创建新的 Promise。

数组可以放入函数,会自动 new Promise 并执行函数,其它类型则直接 resolve 掉。如果有 reject 返回第一个。

function promiseQueue (executors) {
  return new Promise((resolve, reject) => {
    if (!Array.isArray(executors)) { executors = Array.from(executors) }
    if (executors.length <= 0) { return resolve([]) }

    var res = []
    executors = executors.map((x, i) => () => {
      var p = typeof x === 'function' ? new Promise(x) : Promise.resolve(x)
      p.then(response => {
        res[i] = response
        if (i === executors.length - 1) {
          resolve(res)
        } else {
          executors[i + 1]()
        }
      }, reject)
    })
    executors[0]()
  })
}

下面例子可以看到,前面异步的时间更长,但依然按顺序执行

function alarm (msg, time) {
  return resolve => {
    setTimeout(() => {
      console.log(msg)
      resolve(msg)
    }, time)
  }
}

promiseQueue([alarm('1', 4000), alarm('2', 1000), 12, 'hellp', alarm('3', 3000)]).then(x => console.log(x))

promiseQueue([() => Promise.reject('error1'), 12, 'hellp', () => Promise.reject('error2')]).then(null, e => console.log(e))

这篇关于javascript - promise串行封装的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆