【问题标题】:Promise.all get put function as parameter with valuesPromise.all 获取 put 函数作为带值的参数
【发布时间】:2016-05-25 07:37:33
【问题描述】:

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

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 在承诺中做某事时,我可以喜欢 aa.cancel(); 等,现在的问题是我需要将其更改为 接下来,让我说我在循环中,需要在里面获取值,那么我该如何在 catch 中执行 cancel

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

【问题讨论】:

  • 您无法取消没有参考的 Promise。就像您不能在没有参考的对象上调用方法一样。
  • 以同样的方式创建它,但要确保考虑到循环和闭包
  • @JaromandaX - 您能否提供示例作为答案?
  • @MadaraUchiha - 但假设我需要将参数传递给这个承诺(我已经传播了之前提供的价值和承诺所有之后......),我应该如何克服这个?跨度>
  • 最重要的是,您不能取消已经完成的承诺。

标签: javascript promise bluebird cancellation


【解决方案1】:

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

如果你有一个简单的 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);
}

如果您展示一些更具体的示例来说明您想要实现的目标,如果这没有帮助,我可以编辑答案以针对具体细节

【讨论】:

  • 顺便说一句,你也错过了:在dothings 中将aa 替换为a。 :)
  • 是的,我最初在 IIFE 中有 aa, bb 和 dothings 作为参数名称,但为了更清楚,我改为 a, b - 忘记全部更改了:p
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-17
  • 2017-04-28
  • 1970-01-01
  • 2019-02-25
相关资源
最近更新 更多