从函数值内打破承诺图?

时间:2015-07-17 17:59:10

标签: javascript promise bluebird

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

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图中插入错误并抛出该错误打破地图链?

是否有另一种蓝鸟方法可以连续运行一系列承诺?

1 个答案:

答案 0 :(得分:1)

这里的答案是使用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"
})