【问题标题】:Multiple producers for a single resolver/promise单个解析器/承诺的多个生产者
【发布时间】:2015-08-31 17:57:02
【问题描述】:

在 Q 文档中有这一行:

“您可以将解析器提供给任意数量的生产者,首先解决承诺的人获胜。此外,除非您也将承诺部分也提供给生产者,否则任何生产者都无法观察到他们输了。”

我真的不明白这是在说什么。这是在您手动构建承诺时使用的吗?谁能给我一个例子吗?

【问题讨论】:

    标签: javascript node.js promise q


    【解决方案1】:

    这适用于您手动构建 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
    });
    

    【讨论】:

    • 这种行为是 A+ 吗?在这些场景下,bluebird 和 native 会做同样的事情吗?
    • @MadaraUchiha A+ 只指定promise 库之间的interoperability,它没有指定promise 构造函数。 Promise 构造函数规范和 ECMAScript 规范指定了这一点。是的,它们的行为都是一样的。
    【解决方案2】:

    是的,我最近对这种说法不屑一顾。不幸的是,您需要已经了解 Deferreds/Promises 才能了解其实际含义。

    对我来说,问题从介绍句开始:

    延迟很酷,因为它们将承诺部分与解析器部分分开。所以:

    这是一种误导,因为 Deferred 实际上并没有分离这些组件 - 更准确的说法是它们组合它们,但如果需要允许它们分离。

    即兴发挥,更好的措辞是:

    Deferreds [很酷,因为它们] 包括派生 Promise 的方法,并以可执行方法的形式包括解决或拒绝的方法,所有这些都包含在一个对象中。所以:”

    以“您可以向任意数量的消费者作出承诺......”开头的句子有点罗嗦,但其他方面都很好。

    但是以“您可以将解析器提供给任意数量的生产者...”开头的句子最好这样读:

    解析和/或拒绝方法很容易分离,例如,您可以将它们传递给任意数量的生产者,并且首先解决/拒绝的人获胜;此外,通过传递 detached 方法而不是 Deferred 本身(以及它的 Promise),没有一个生产者可以观察到他们是赢还是输。”

    还可能包含第三条语句:

    可以完整地传递 Deferred,包括解析/拒绝和派生 Promise 的方法。”

    事实上,以上所有都可以通过new Promise(synchronousSettlerFunction) 构造和外部变量来实现。

    还应该说,像这样的陈述可以多次审查和改进。我上面的尝试花了我 15 分钟,所以我不会假装他们是硬道理。

    【讨论】:

    • 所以提出一个拉取请求:)?
    • 我可以从 Q 文档拉取请求中获得终身职业 :-)
    • 那么什么是制片人?
    • “生产者”是 Q 文档该部分中使用的术语,我不知道其他地方有类似用法。从上下文来看,我们将其理解为“导致 Deferred 解决或拒绝的函数 - 即解决 - 但不一定是创建 Deferred 的函数”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-11
    • 2020-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    相关资源
    最近更新 更多