一个解析器/承诺有多个生产者
Multiple producers for a single resolver/promise
在Q文档中有这样一行:
"你可以把这个解决方案给任意数量的生产者,谁先解决这个承诺谁就赢。此外,除非你也给他们承诺部分,否则没有人会注意到他们输了。"
我真的不明白那在说什么。这是在你手工构建承诺的时候用的吗?有人能给我举个例子吗?
这是当你手工构建一个承诺时使用的吗?
确实,你可以用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
});
是的,我最近对这句话感到惊讶。不幸的是,为了理解它们的真正含义,你需要先理解deferred/Promises。
对我来说,问题始于这句引言:
deferred很酷,因为它们把promise部分和resolver部分分开了。所以:
这是一种误导,因为deferred实际上并没有分离这些组件——更准确的说法是它们组合它们,但在需要时允许它们分离。
即兴地,更好的措辞应该是:
deferred[很酷,因为它们]包含了派生Promise的方法,并以可执行方法的形式包含了解析或拒绝的方法,所有这些都包含在一个对象中。所以:"
开头的那句"You can give The promise to any number of consumers…"有点啰嗦,但在其他方面还不错。
但是以"You can give the resolver to any number of producers…"开头的句子最好写成:
resolve和/或reject方法很容易分离,例如,允许你将它们传递给任意数量的生产者,谁先解决/拒绝谁就赢;此外,通过传递分离的方法而不是Deferred本身(以及它的Promise),没有任何生产者可以观察到他们是赢了还是输了。"
还可以包含第三条语句:
Deferred可以完整地传递,包括解析/拒绝和派生Promise的方法。"
实际上,以上所有都可以通过new Promise(synchronousSettlerFunction)
结构和外部变量来实现,只需稍作改动。
还应该说,像这样的语句可以多次审查和改进。我上面的尝试花了我15分钟,所以我不会假装它们是最后的定论。
- 我的职位回报太快了,如何做出承诺
- 打破承诺链的好方法是什么
- 从函数返回角度承诺
- 我怎样才能获得承诺的价值
- 延期承诺值未更新/解析/延期
- 在承诺链中处理早期回报的最佳方式
- 承诺在非节点式回调上使用Bluebird
- 简单的ES6承诺问题-交换解决和拒绝参数
- 组合承诺和非承诺值
- 带有对象/原型的链式承诺(Q延期)
- AngularJS$q承诺使用socket.io
- React JS:未捕获(在承诺中)语法错误:在位置 0 的 JSON 中意外<令牌
- 当一些承诺失败时,如何继续使用$q.all()
- Nodejs和express路由,如何处理客户端的承诺
- 如何在多承诺链中处理谷歌地图API V3事件
- 承诺合并流
- JavaScript承诺-无法读取属性'那么'的未定义
- 等待循环调用的所有承诺完成
- Pg承诺性能提升:在冲突中
- 一个解析器/承诺有多个生产者