单个解析器/承诺的多个生产者

时间:2015-08-30 12:59:26

标签: javascript node.js promise q

在Q文档中有这一行:

"您可以将解析器提供给任意数量的生产者,并且解决承诺的人首先获胜。此外,除非你给予承诺部分,否则没有一个制作人能够观察到他们输了。"

我真的得不到那句话。当你手工构建承诺时,这是为了吗?有人可以给我一个例子吗?

2 个答案:

答案 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分钟所以我不会假装他们是硬道理。