从函数值中打破承诺图?

Break promise map from within function value?

在下面的示例代码中,您可以看到我有一个正在映射的函数链,以及何时何地抛出错误时链退出。全局 x 的值从第一个函数设置为 bar 但它没有从第三个函数设置为 baz 因为它永远不会 运行s.

var x = "foo"

Promise.map([
  function(){
    x = "bar"
    return true
  },
  function(){
    throw new Error()
  },
  function(){
    x = "baz"
    return true
  }
], function(fn){
  return Promise.method(fn)()
})
.catch(function(e){
  console.log(e) // [Error]
})
.then(function(){
  console.log(x) // "bar"
})

然而,当我在 map 函数中打开 promise 并插入有条件抛出的错误时,x 更改为 baz,而第三个函数执行 运行。

var x = "foo"

Promise.map([
  function(){
    x = "bar"
    return true
  },
  function(){
    return "bad value throw error"
  },
  function(){
    x = "baz"
    return true
  }
], function(fn){
  return Promise.method(fn)().then(function(val){
    if(val == "bad value throw error") throw new Error()
    return val
  })
})
.catch(function(e){
  console.log(e) // [Error]
})
.then(function(){
  console.log(x) // "baz"
})

如何在 promise 映射中插入错误并抛出该错误来破坏映射链?

有没有另一种bluebird方法可以运行一系列promise?

这里的答案是使用each而不是map

var x = "foo"

Promise.each([
  function(){
    x = "bar"
    return true
  },
  function(){
    return "bad value throw error"
  },
  function(){
    x = "baz"
    return true
  }
], function(fn){
  return Promise.method(fn)().then(function(val){
    if(val == "bad value throw error") throw new Error()
    return val
  })
})
.catch(function(e){
  console.log(e) // [Error]
})
.then(function(){
  console.log(x) // "baz"
})