3

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

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

你将如何使用 Q 重写它?

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

4

2 回答 2

6

简单的答案:

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定义得更清楚。Promise 表示可能尚不可用的单个值。这非常精确地并行同步代码。

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

因为在这种情况下,我们确切地知道数组的长度,并且基本上只需要单独的项目,所以spread使用Q. 当对数组的 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 的人有一些非常有用的建议。如果您发现其中有任何可以改进的地方,您可以对其进行编辑,并希望能帮助未来的人们做出同样的转变。

于 2013-04-22T16:06:24.770 回答
0

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

结合承诺

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

Q和jQuery的比较

使用 jQuery 或 Q.Js 实现承诺

尽管这远非一个普遍的事实,但您会发现 Q 在服务器端 Node.js 编程中更受欢迎,而 jQuery 更适合在客户端(在浏览器中)使用。

如果像我一样,你来到 Q 之前已经学习了 jQuery,那么你会发现 Q 非常混乱。特别是Promises/A 提案中的声明:

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

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

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

于 2013-04-21T06:56:45.550 回答