【问题标题】:Short-cutting a promise缩短承诺
【发布时间】:2015-02-09 18:02:19
【问题描述】:

我正在创建一个 deferred,然后在一个涉及异步行为的函数中返回一个 Promise。

var deferred = $q.defer();
//...make use of the deferred
return deferred.promise;

我想在函数顶部添加一个快捷方式,该快捷方式将绕过异步活动并立即有效地返回已解决的承诺。我该怎么做?

例如这会是惯用的吗?

if (shouldShortcut) {
    return $q.when(true);
}

【问题讨论】:

  • 所以Q 没有与Promise.resolve(value) 相同的值?查看文档Q(value) 应该创建一个解决承诺吗? [...]If value is not a promise, returns a promise that is fulfilled with value.[...]
  • @t.niese Q 确实有 Q.Promise.resolve(),但 $q 似乎没有。
  • @StephenJames 虽然.when() 可能不是惯用用法,但它可以实现 OP 想要实现的目标 - 从非承诺值生成已解决的承诺。
  • @JLRishe,你是对的 :)

标签: javascript angularjs promise angular-promise


【解决方案1】:

你可以立即解决 deferred,但仍然返回它的 promise:

if (shouldShortcut) {
  deferred.resolve();
  return deferred.promise;
}

【讨论】:

  • 这会保留异步语义吗?即下一个then(或finally)会发生在下一个刻度上,还是会在当前刻度上立即继续(假设它已立即解决)?
  • 他的回答 $q.when(true) 更好 - 无需涉及延期。下一个 thenfinally 将在下一个滴答时发生,而不是立即发生(立即发生会很疯狂,因为它会导致竞争条件和同步问题)。
  • ...而不是立即 - 实际上我认为这是意图。 )
  • @Ben 在 Promises/A+ 兼容的承诺(我相信 $q 承诺是),.then() 方法保证不会立即调用它的回调,即使它是在一个已经被调用的 -已解决的承诺。
【解决方案2】:

编辑:我现在看到您在谈论 $q 而不是 Q。请参阅下面的中断,了解我之前与 Q 库有关的答案。

根据 Benjamin Gruenbaum 在下面的评论(他已经删除),$q.when() 是一个很好的方法:

var resolvedPromise = $q.when();

您可以通过将特定值传递给when() 来解析:

var resolvedPromise = $q.when("all good");

这里没有必要涉及延期。事实上,我建议限制你对延迟的使用,因为它们很可能很快就会被 ES6 中使用的 revealing constructor pattern 所取代。


(上一个答案)

Q 库提供了一种符合 ES6 承诺标准的方法:

Q.Promise.resolve();

这会产生一个已解决的承诺。

如果你想用一个特定的值来解析它,你可以传入那个值:

Q.Promise.resolve("all good");  // promise resolved with the value "all good"

【讨论】:

  • @BenjaminGruenbaum 我不知道$q.when("all good")$q.when() 的惯用用法,因为我认为它的预期目的是包装潜在的不可预测的值。但如果你赞成,那我也赞成。
猜你喜欢
  • 2018-01-04
  • 2015-10-06
  • 2018-06-23
  • 2018-09-12
  • 2021-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多