使用bluebird .reflect()来克服Promise.all()

时间:2016-07-21 00:02:24

标签: javascript node.js promise bluebird

让我们说有一个数字数组,定期用setInterval你需要获取和删除前5个元素,根据这5个数字,你需要做一些异步的东西,如下所示

  1. 五个数字中的每一个从DB
  2. 获得一些东西
  3. 为DB中的结果集中的每条记录执行另一个异步操作
  4. 如果在应该将数字返回到数组的方式上发生任何错误,
  5. 应该以这种方式进行错误处理,以确保为该数字重复整个事物(1.和2.)
  6. 根据某些数字从DB获取内容完全独立于使用其他数字执行相同操作。同样适用于提取的记录 s 。所以在1.和2. Promise.all听起来都很棒,但事实是Promise.all拒绝,如果任何通过的承诺拒绝,则与所描述的场景不能很好地协调。基本上,如果所有对DB的调用都解析了除最后一个拒绝的记录,我就无法继续成功的记录和记录。

    因此无法通过本机Promise支持来解决这个问题,我调查了bluebird与我很少/没有经验的人,这就是我发布此问题的原因。通过API参考,在我看来这可以很容易地用.reflect()来解决?我尝试了什么:

    setInterval(() => {
      const firstFive = numbers.splice(0, 5)
    
      Promise.all(firstFive.map((number) => firstAsync(number).reflect()))
      .each((result, index) => {
        if (result.isRejected()) {
          return numbers.unshift(firstFive[index])
        }
    
        return Promise.all(result.value().map((record) => secondAsync(record).reflect()))
        .each((result, index) => {
          if(result.isRejected()) {
            return numbers.unshift(firstFive[index])
          }
        })
      })
    }, 500)
    

    我是否以预期的方式使用.reflect()?除此之外,我盲目地猜测.each((result, index) => {...}).then((results) => results.forEach((result, index) => {...})之类的语法糖,不是吗?

1 个答案:

答案 0 :(得分:0)

我想知道你为什么要使用char。你说五个数字完全相互独立,看起来你不需要等待他们五个人做任何事情。

所以只需单独处理它们:

Promise.all