【问题标题】:$q.all in a then Clause$q.all 在 then 子句中
【发布时间】:2016-06-03 13:17:49
【问题描述】:

在承诺链then 子句中使用$q.all 的正确方法是什么?

这里有一些伪类型代码来说明我正在尝试做的事情。

function nestedPromise(val) 
{
    return aPromiseReturningFunction(val)
        .then($q.all(val.arrayProperty.map(function(anotherVal) 
        {
            return anotherPromiseReturningFunction({
                prop1: anotherVal.prop
            });
        })));
}

期望:如果在对 $q.all 的调用中返回的任何承诺拒绝,nestedPromise 返回的承诺将拒绝。

实际:nestedPromise 返回的承诺已解决,即使在对 $q.all 的调用中返回的承诺之一被拒绝。

我无法发布我试图让它工作的所有东西,因为我觉得我已经尝试了所有东西......catches 到处都是,使用deferred 等。我想在某一时刻通过使用大量的延期和catches,我让事情“工作”了,但这真的很难看,而且肯定没有用,因为我知道自己在做什么。

我的$q.all 调用中的所有函数调用是否都是并行运行的预期行为?这似乎是当前正在发生的事情,因为即使在一个承诺被拒绝后,其余承诺仍会继续运行。目前,我可以处理这种行为,虽然它看起来不太正确,我想知道在遇到第一次拒绝后如何停止执行。

【问题讨论】:

  • then 接受一个函数,我真的不知道 $q 但看起来你可以这样做:val => $q.all(..)。我真的不知道你是否期望$q.all 中的valnestedPromise 函数的参数或promise 的解析值相同。
  • then函数传递一个返回$q.all(/* ... */)的函数,即一个promise。
  • 感谢您的回复,@LoremIpsum!所以你是说将$q.all 分解成一个单独的函数并在我的then 中调用它?那在功能上与我正在做的事情有何不同?
  • @MinusFour - 在这种情况下,我的意图是 val 始终指向传递给最外层函数的值。您的建议(val => $q.all(...))是如果我想将aPromiseReturningFunction 返回的值传递给$q.all 的调用,对吗?这不是我想要做的。

标签: javascript angularjs promise angular-promise


【解决方案1】:

then() 期望将一个函数传递给它。您目前正在此处传递另一个 Promise 对象

then($q.all(val.arrayProperty.map(function(anotherVal)

你应该这样做

function nestedPromise(val) {
    return aPromiseReturningFunction(val)
      .then(function() {
        return $q.all(val.arrayProperty.map(function(anotherVal) {
          return anotherPromiseReturningFunction({
            prop1: anotherVal.prop
          });
        })
      });
}

【讨论】:

  • 看起来,很有前途!我现在无法测试它。将尽快报告。非常感谢您的回答!
  • 这绝对有效。但是,如果我将then 中的匿名函数分解为一个单独的函数,它就会停止工作。为什么会这样?另外,你对$q.all中的promise在遇到第一次拒绝时不会停止运行有任何见解吗?
  • 您可以将匿名函数分解为一个单独的函数,只要它返回一个Promise。至于$q.all() 在第一次拒绝中停止,这是设计使然,它要么等待所有承诺解决,要么在执行期间发生任何拒绝时拒绝。
  • 我认为您误解了我的评论。如果我将匿名函数复制并粘贴到一个单独的函数中(其返回值为$q.all),它将停止工作,也就是说nestedPromise 的返回值已解析。这是代码 sn-p 的简明版本:.then(addAnother(val))function addAnother(val) { return $q.all(...); }。对于我的第二个问题,我不是在问如果只有一个子承诺拒绝,为什么它会拒绝。我在问为什么它在遇到第一次拒绝后继续运行剩余的承诺。
  • 您能否提供一个要点或代码笔,看看您的代码实际是什么样子会更有帮助。
猜你喜欢
  • 2017-11-03
  • 1970-01-01
  • 2019-09-28
  • 1970-01-01
  • 2020-08-03
  • 2021-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多