【发布时间】:2015-08-31 17:57:02
【问题描述】:
在 Q 文档中有这一行:
“您可以将解析器提供给任意数量的生产者,首先解决承诺的人获胜。此外,除非您也将承诺部分也提供给生产者,否则任何生产者都无法观察到他们输了。”
我真的不明白这是在说什么。这是在您手动构建承诺时使用的吗?谁能给我一个例子吗?
【问题讨论】:
标签: javascript node.js promise q
在 Q 文档中有这一行:
“您可以将解析器提供给任意数量的生产者,首先解决承诺的人获胜。此外,除非您也将承诺部分也提供给生产者,否则任何生产者都无法观察到他们输了。”
我真的不明白这是在说什么。这是在您手动构建承诺时使用的吗?谁能给我一个例子吗?
【问题讨论】:
标签: javascript node.js promise q
这适用于您手动构建 Promise 的时候吗?
没错,您可以使用 deferred 或 promise 构造函数创建一个 Promise,多次调用 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 函数,它返回第一个解决两个承诺的结果(为简洁起见省略了错误处理):
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
});
【讨论】:
是的,我最近对这种说法不屑一顾。不幸的是,您需要已经了解 Deferreds/Promises 才能了解其实际含义。
对我来说,问题从介绍句开始:
延迟很酷,因为它们将承诺部分与解析器部分分开。所以:
这是一种误导,因为 Deferred 实际上并没有分离这些组件 - 更准确的说法是它们组合它们,但如果需要允许它们分离。
即兴发挥,更好的措辞是:
Deferreds [很酷,因为它们] 包括派生 Promise 的方法,并以可执行方法的形式包括解决或拒绝的方法,所有这些都包含在一个对象中。所以:”
以“您可以向任意数量的消费者作出承诺......”开头的句子有点罗嗦,但其他方面都很好。
但是以“您可以将解析器提供给任意数量的生产者...”开头的句子最好这样读:
解析和/或拒绝方法很容易分离,例如,您可以将它们传递给任意数量的生产者,并且首先解决/拒绝的人获胜;此外,通过传递 detached 方法而不是 Deferred 本身(以及它的 Promise),没有一个生产者可以观察到他们是赢还是输。”
还可能包含第三条语句:
可以完整地传递 Deferred,包括解析/拒绝和派生 Promise 的方法。”
事实上,以上所有都可以通过new Promise(synchronousSettlerFunction) 构造和外部变量来实现。
还应该说,像这样的陈述可以多次审查和改进。我上面的尝试花了我 15 分钟,所以我不会假装他们是硬道理。
【讨论】: