在Q文档中有这一行:
"您可以将解析器提供给任意数量的生产者,并且解决承诺的人首先获胜。此外,除非你给予承诺部分,否则没有一个制作人能够观察到他们输了。"
我真的得不到那句话。当你手工构建承诺时,这是为了吗?有人可以给我一个例子吗?
答案 0 :(得分:3)
这是在你手工制作承诺的时候吗?
确切地说,您可以使用延迟或承诺构造函数创建承诺,多次调用resolve
,但只有第一次才有效。例如:
var p = new Q.Promise(function(resolve){
resolve(1);
resolve(2);
resolve(3);
resolve(4);
resolve(5); // can also pass `resolve` around.
});
p.then(function(result){
// always 1, all other calls had no effect.
});
这可以让你构建有趣的东西,比如让我们构建一个race
函数,它返回第一个解析两个promise的结果(为简洁省略了错误处理):
function race(p1, p2){
return new Promise(function(resolve){
p1.then(resolve);
p2.then(resolve);
});
}
首先要解决哪个承诺,例如:
race(tryToGetFromFirstAPI(), tryToGetFromSecondAPI()).then(function(result){
// resolves as soon as the "fastest" resolved, with the result
});
答案 1 :(得分:2)
是的,我最近对该声明提出了疑问。不幸的是,您需要已经了解Deferreds / Promises以了解实际意义。
对我来说,问题始于介绍性句子:
延迟很酷,因为它们将承诺部分与解析器部分分开。所以:
这是误导性的,因为Deferreds实际上分离这些组件 - 说它们组合它们更准确,但如果需要允许它们分开。
关闭袖口,更好的措辞是:
Deferreds [很酷,因为它们]包括派生Promise的方法,并以可执行方法的形式包括解析或拒绝的方法,所有这些都包含在一个对象中。所以:“
句子开头“你可以向任何数量的消费者承诺...”有点罗嗦但其他方面都很好。
但是句子开头“你可以将解析器交给任意数量的制作人......”会更好地阅读:
解决方法和/或拒绝方法很容易分离,例如,允许您将它们传递给任意数量的制作人以及解决/拒绝第一次胜利的人;此外,通过传递分离的方法而不是Deferred本身(以及它的Promise),没有一个制作人能够观察他们是赢还是输。“
也可能包括第三条陈述:
延期可以完整传递,包括解决/拒绝和获得承诺的手段。“
事实上,所有上述都可以,只需要一点点jiggery-pokery,也可以使用new Promise(synchronousSettlerFunction)
构造和外部var实现。
还应该说,像这样的陈述可以多次审查和改进。我上面的尝试花了我15分钟所以我不会假装他们是硬道理。