【问题标题】:Combining promises with Q将 Promise 与 Q 相结合
【发布时间】:2013-04-13 10:40:58
【问题描述】:

在 jquery 中,我可以按如下方式组合 Promise:

var Promise = $.when(func1.execute(), func2.execute());
Promise.done(function (data1, data2) {
// code here
}

你会如何用 Q 重写这个?

还有。在这种情况下使用 Q 比 jquery 有什么好处?

【问题讨论】:

    标签: jquery promise q


    【解决方案1】:

    简单回答:

    var promise = Q.all([func1.execute(), func2.execute()]);
    promise.spread(function (data1, data2) {
      // code here
    })
    .done();
    

    注释:

    //make `promise` be a promise for the array
    var promise = Q.all([func1.execute(), func2.execute()]);
    
    //use spread to spread the array across the arguments of a function
    promise.spread(function (data1, data2) {
      // code here
    })
    //use done so errors are thrown
    .done();
    

    Q 中的概念定义更加清晰。承诺代表一个可能尚不可用的单一值。这非常精确地平行于同步代码。

    为了表示多个值,我们只需使用一个数组。 Q.all 是一个辅助方法,它接受一个 promise 数组,并返回一个包含它们已实现值的数组的 promise。如果数组中的任何 Promise 被拒绝,则生成的 Promise 也将被拒绝。

    因为在这种情况下,我们确切地知道数组的长度并且基本上只需要单独的项目,所以使用Q 提供的spread 帮助器很方便。当对数组的 promise 调用时,spread 获取数组中的项目并将它们分散到函数的所有参数中。你可以简单地做到:

    //make `promise` be a promise for the array
    var promise = Q.all([func1.execute(), func2.execute()]);
    promise.done(function (data) {
      var data1 = data[0];
      var data2 = data[1];
      // code here
    });
    

    这可能在概念上更简单,但相当不干净。我强烈建议您通读https://github.com/kriskowal/q/wiki/Coming-from-jQuery,因为这对来自 jQuery 的人有一些非常有用的建议。如果您发现其中有任何可以改进的地方,您可以对其进行编辑,并希望能帮助未来的人们做出同样的转变。

    【讨论】:

    • 感谢福布斯,这正是我想要的!
    【解决方案2】:

    在几分钟的研究之后,问题中没有什么是无法发现的,但是这里是:

    组合承诺

    https://github.com/kriskowal/q/wiki/API-Reference#promise-for-array-methods

    Q和jQuery的比较

    Use jQuery or Q.Js for promises

    虽然这远非一个普遍的事实,但您会发现 Q 在服务器端 Node.js 编程中更受青睐,而 jQuery 在客户端(在浏览器中)更受青睐。

    如果你像我一样来 Q 之前已经学过 jQuery,那么你会发现 Q 很混乱。特别是来自Promises/A proposal的声明:

    如果回调抛出错误,返回的 Promise 将被移动到失败状态

    在 jQuery 中是比喻性的,而在 Q 中是字面意义上的。因此,虽然 Q 强调抛出/捕获错误(实际上和类比的一些方法的命名),但没有这样的强调,实际上没有这样的概念, 存在于 jQuery 中。

    上述陈述在 [Promises/A+] 提案的第 3.2.4.6.2 节更正式地表达,导致拒绝模型(与第 3.2.4.6 节的其余部分一起)您将认为完全正确或不必要的僵化,具体取决于您的观点。据我了解,Q 符合第 3.2.4.6 节; jQuery 没有。

    【讨论】:

    • 感谢您的几分钟,但我仍然没有关于如何在 Q 中重写上述内容的答案。我需要返回 .done() 中的值。从 Q 文档中不清楚如何做到这一点。 .allResolved() 和 .all() 似乎在球场上,但没有利用 .done()。
    猜你喜欢
    • 2018-12-25
    • 2017-01-09
    • 2017-02-27
    • 2013-06-05
    • 2012-11-07
    • 2015-08-03
    • 2015-10-18
    • 2019-12-02
    • 2012-05-19
    相关资源
    最近更新 更多