kriskowal/q node.js q.all and spread
kriskowal/q node.js q.all and spread
我有一个函数,它需要传递给它的三个先前承诺的结果。一个是线性相关的,另外两个可以并发运行。我想使用q.all来解析三个promise,然后使用.spread将结果传递给第四个promise。然而,我的代码不工作。如有任何帮助,不胜感激。
var p1 = doWork(data);
var p2 = p1.then(doMoreWork);
var p3 = doConcurrentWork(data);
return q.all([p1,p2,p3]).spread(funcWith3params)
.fail(function(err) {
console.log(err):
}
我可以在node-inspector中跟踪代码,看到前3个promise被调用了。但是,.spread调用的函数没有被调用。知道为什么吗?而且。fail也没有被击中。
Spread在内部调用q.all。
下面是q.js中的spread代码:
Q.spread = spread;
function spread(promise, fulfilled, rejected) {
return when(promise, function (valuesOrPromises) {
return all(valuesOrPromises).then(function (values) {
return fulfilled.apply(void 0, values);
}, rejected);
}, rejected);
}
请注意,它期望一个promise解析为一个数组或一个数组作为第一个参数。
因此你的调用应该是这样的:
var p1 = doWork(data);
var p2 = p1.then(doMoreWork);
var p3 = doConcurrentWork(data);
return q.spread([p1,p2,p3], funcWith3params, function(err) {
console.log(err):
});
但是,您的原始调用应该也可以工作。不知道为什么没有
表示您提供的示例的最简洁的方式是:
var p1 = doWork(data);
var p2 = p1.then(doMoreWork);
var p3 = doConcurrentWork(data);
return Q.spread([p1, p2, p3], funcWith3params)
.done();
然而,原文是正确的。
我怀疑问题是一个或多个输入承诺永远不会解决。尝试使用超时隔离问题。
var p1 = doWork(data).timeout(1000, 'p1 timed out');
var p2 = p1.then(doMoreWork).timeout(1000, 'p2 timed out');
var p3 = doConcurrentWork(data).timeout(1000, 'p3 timed out');
return Q.spread([p1, p2, p3], funcWith3params)
.done();
相关文章:
- Selenium WebDriver and JavaScript change
- PHP and Javascript functions
- Javascript Return and if/else
- SetTimeout and clearTimeout in Javascript
- lightbox in html 5 and javascript
- TimelineJS and AngularJS
- timeago.js with datatable and PHP
- javascript button ajax and php
- Ajax and Json with Rails
- Combine onload, onresize and onclick
- php布尔值's小写AND大写和数字布尔值'可以接受
- setTimeout and V8
- Jquery post and onclick
- Moment js and IOS
- Rails 3.2 and Paloma gem
- Backbone, TypeScript, and super
- iframe and JavaScript on different pages
- JSON and jQuery Search
- Flash and External Javascript
- kriskowal/q node.js q.all and spread