一个解析器/承诺有多个生产者

Multiple producers for a single resolver/promise

本文关键字:承诺 生产者 一个      更新时间:2023-09-26

在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分钟,所以我不会假装它们是最后的定论。