在jquery中,我可以将promises组合如下:
var Promise = $.when(func1.execute(), func2.execute());
Promise.done(function (data1, data2) {
// code here
}
你会如何使用Q重写这个?
另外。在这个场景中使用Q而不是jquery有什么好处?
答案 0 :(得分: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。如果数组中的任何承诺被拒绝,那么结果承诺也将被拒绝。
因为在这种情况下,我们确切知道数组的长度,并且基本上只是想单独使用这些项目,所以使用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的人有一些非常有用的建议。如果您发现其中有任何可以改进的内容,您可以对其进行编辑,并希望帮助未来的人们进行相同的转换。
答案 1 :(得分:0)
在几分钟的研究之后,问题中没有任何内容无法发现,不过这里有:
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中。
上述陈述在[承诺/ A +]提案的第3.2.4.6.2节中更正式地表达,导致拒绝模型(与第3.2.4.6节的其余部分一起),您将认为完全正确或根据您的观点不必要地不灵活。据我了解,Q符合第3.2.4.6节; jQuery没有。