为什么Q.js在解决后承诺异步?

Chr*_*lew 6 javascript promise angularjs

如果我有以下内容:

var deferred = Q.defer();

deferred.resolve();

var a = deferred.promise.then(function() {
    console.log(1);    
});

console.log(2); 
Run Code Online (Sandbox Code Playgroud)

...为什么我在控制台中看到2,然后是1?

我理解这个输出是正确的,根据Promises规范,它说在下一个tick(例如setTimeout())上调用该函数,即使它已经被解析,但我不明白为什么.

then假设已经解决了所有的承诺,我想拥有同步调用一系列promise的代码.

我真正的用例是我正在尝试使用Angular的实现,$q并且我希望所有的then回调都在同一个$digest循环中执行,这样我就不会得到不必要的后续$digest循环.

Den*_*ret 2

答案是一致性。

在实际代码中,您没有在创建时总是立即解决的承诺,它们是毫无意义的。所以你的承诺有时可能会立即得到解决。

在这种情况下,您不希望有不同的流程。您想要始终相同的、可预测的流程。因此,您希望下一个函数始终在下一个报价时调用。

当你不需要承诺时,不要使用承诺。

  • 我相信的技术术语是“不要释放 Zalgo”,方法必须_始终_要么是异步的,要么是同步的,否则你会得到非常奇怪的竞争条件,会让你哭泣。 (2认同)
  • @MariuszNowak 在我看来,这是一个非常糟糕的主意。极少数情况下它可能会带来更好的性能,但这并不能弥补分析代码的困难以及它会导致的微妙错误。 (2认同)
  • @MariuszNowak 来吧...几年内的 33 个问题并不是很多用户...我可以了解您对“.done”的立场(我仍然相信这是一个幼稚实现的冗余工件,用于在库中执行某些操作或者本地承诺应该做) - 但释放 Zalgo?进行这种同步调度是一个可怕的想法,jQuery 的承诺为此而臭名昭著。我个人不得不用 jQuery Promise(表现出这种行为)来处理几个这样的情况......这_绝对_不是一个“非问题”。 (2认同)