Promise.all将put函数作为参数,值为

时间:2016-02-14 12:20:16

标签: javascript promise bluebird cancellation

我使用以下可正常工作的代码,

var aa = createA(val, 1000);
var bb = createB(val2, 500);


Promise.all([aa, bb])
  .spread(function(v1, v2) {
    console.log("im Here")
  }).catch(function() {
      aa.cancel()

现在,当我需要在承诺中做一些我喜欢aa.cancel();等的事情时,现在的问题是我需要改变它就像 跟随并让我们说我在内部循环并需要获取内部值,那么如何才能在catch 中执行取消?

Promise.all([createA(val, 1000), bb])
      .spread(function(v1, v2) {
        console.log("im Here")
      }).catch(function() {

1 个答案:

答案 0 :(得分:0)

在不知道“循环”的具体细节的情况下,我指的是我只能推测

如果你有一个简单的for循环,由于Promises的异步性质,这将无法按预期工作

  

要明确,不要这样做

for (i = 0; i < 1000; i ++) {
    var aa = createA(val, 1000);
    var bb = createB(val2, 500);


    Promise.all([aa, bb])
    .spread(function(v1, v2) {
        console.log("im Here")
    }).catch(function() {
        aa.cancel()
    });
}

你需要一个闭包 - 类似于IIFE(立即调用函数表达式)

for (i = 0; i < 1000; i ++) {
    var aa = createA(val, 1000);
    var bb = createB(val2, 500);

    (function(a, b) {
        Promise.all([a, b])
        .spread(function(v1, v2) {
            console.log("im Here")
        }).catch(function() {
            a.cancel()
        });
    }(aa, bb));
}

或简单地说,在循环外创建一个函数并调用它

function dothings(a, b) {
    Promise.all([a, b])
    .spread(function(v1, v2) {
        console.log("im Here")
    }).catch(function() {
        a.cancel()
    });
}

for (i = 0; i < 1000; i ++) {
    var aa = createA(val, 1000);
    var bb = createB(val2, 500);

    dothings(aa, bb);
}
  

如果你展示一些你想要实现的更具体的例子,我可以编辑答案来定位具体细节,如果这没有帮助