【发布时间】: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:
var Promise = $.when(func1.execute(), func2.execute());
Promise.done(function (data1, data2) {
// code here
}
你会如何用 Q 重写这个?
还有。在这种情况下使用 Q 比 jquery 有什么好处?
【问题讨论】:
简单回答:
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 的人有一些非常有用的建议。如果您发现其中有任何可以改进的地方,您可以对其进行编辑,并希望能帮助未来的人们做出同样的转变。
【讨论】:
在几分钟的研究之后,问题中没有什么是无法发现的,但是这里是:
https://github.com/kriskowal/q/wiki/API-Reference#promise-for-array-methods
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 没有。
【讨论】: