【问题标题】:Is resolve() can can be called implicitly in $q from anjularjs?是否可以从 angularjs 在 $q 中隐式调用 resolve()?
【发布时间】:2014-10-12 10:34:43
【问题描述】:

https://docs.angularjs.org/api/ng/service/$q 从 $q API 的文档中,then(successCallback, errorCallback, notifyCallback) 返回一个新的 Promise,该 Promise 通过 successCallback, errorCallback 的返回值解决或拒绝。
但是,该网站给出了一个没有明确调用resolve的示例

 promiseB = promiseA.then(function(result) {
    return result + 1;
  });

  // promiseB will be resolved immediately after promiseA is resolved and its value
  // will be the result of promiseA incremented by 1

所以调用 then 函数会创建一个新派生的 Promise,但是由于代码没有调用 resolve() 或 reject(),$q 如何知道它的状态?但是既然网站说已经解决了,所以我假设

return result + 1; 

隐式调用 resolve() 是否正确?因此,如果我不显式调用 reject() 并继续调用 then() 并返回一些值,则 Promise 将始终处于解析状态,但我不需要显式调用 resolve?

【问题讨论】:

  • $qpromiseA 被解析时收到有关新状态的通知,例如当调用 .resolve() 的延迟时
  • “技术”术语是 .then 既是 map 也是 flatMap 我猜。

标签: angularjs promise


【解决方案1】:

没有立即解决。正如评论所说:

promiseB 将在 promiseA 解决后立即解决

因此,当promiseA 承诺被解决时(并且只有这样),promiseB 承诺也将被解决,promiseA 的解决结果增加 1。

您必须明确解析 promiseA 才能同时解析 promiseB

如果当你调用 then() 来创建 promiseB 时,promiseA 已经被解析,那么 promiseB 将立即被解析。

【讨论】:

  • 我可以拒绝promiseB吗?那么promiseA的状态决定了promiseB的状态呢?我拒绝promiseB调用reject(),但是promiseB不用调用resolve()就可以解决?
  • 你不会在 promise 上调用 resolve()。您在延迟上调用 resolve()。当在 deferred 上调用 resolve() 时,它的 Promise 以及它的 Promise 的所有派生 Promise 都会被解析。
  • @JBNizet 您应该将最后一条评论编辑到您的答案中 - 这是 OP 遇到的问题的症结所在。还值得一提的是.then 的工作原理。
【解决方案2】:

答案是,promise B 隐式解决的。

当您使用 .then() 注册回调承诺 (B) 时,Angular 会将其放入 $$pending 回调数组中。在解决原始承诺 (A) 后,angular 会在 $$pending 回调上调用 .resolve(),并将内部函数作为参数传递。

在示例中,angular 将在内部运行类似以下内容:

promiseB.resolve((function(result){
  return result + 1;
})(resultFromA))

查看the source 以更深入地了解正在发生的事情。

【讨论】:

    猜你喜欢
    • 2016-04-01
    • 2013-10-08
    • 1970-01-01
    • 1970-01-01
    • 2011-06-03
    • 2013-03-21
    • 1970-01-01
    • 2019-07-22
    • 2020-04-30
    相关资源
    最近更新 更多