我正在尝试运行一系列承诺。 我已经阅读了q kriskowal的github页面和他的序列示例,但他从未将之前的结果用于下一个承诺。
return foo(initialVal).then(bar).then(baz).then(qux);
所以我的代码是:
var Q = require('Q');
function foo(arg) {
console.log('foo arg=' + arg);
var d = Q.defer();
bar(arg+1)
.then(function(){
d.resolve(arg);
}, function(error){
d.reject(error);
})
return d.promise;
}
function bar(arg) {
console.log('bar arg=' + arg);
var d = Q.defer();
d.resolve(arg);
return d.promise;
}
function test() {
var defer = Q.defer();
foo('a')
.then(function (success) {
var def1 = Q.defer();
console.dir('success: ' + success);
bar('test');
})
.then(function (rest) {
return foo('b')
})
.then(function(success){
defer.resolve(success);
}, function(error){
defer.reject(error);
});
return defer.promise;
}
var b = [test(), test(),test()];
Q.all(b)
.then(function(result){
console.dir(result);
})
输出结果为:
foo arg=a
bar arg=a1
foo arg=a
bar arg=a1
foo arg=a
bar arg=a1
'success: a'
bar arg=test
'success: a'
bar arg=test
'success: a'
bar arg=test
foo arg=b
bar arg=b1
foo arg=b
bar arg=b1
foo arg=b
bar arg=b1
[ 'b', 'b', 'b' ]
我想要的是:
foo arg=a
bar arg=a1
'success: a'
bar arg=test
foo arg=b
bar arg=b1
foo arg=a
bar arg=a1
'success: a'
bar arg=test
foo arg=b
bar arg=b1
foo arg=a
bar arg=a1
'success: a'
bar arg=test
foo arg=b
bar arg=b1
答案 0 :(得分:0)
通过这样做:
var b = [test(), test(),test()];
Q.all(b)
.then(function(result){
console.dir(result);
})
您正在并行运行test()3次。因此,获取混合日志条目是正常的。
如果你想连续3次运行test(),你会这样做:
test().then(test).then(test)
.then(function(result){
// result is the result of the 3d run
console.dir(result);
})
如果你想要所有运行的结果,改变test(),这样它接受一个数组并在完成时将结果推入其中,然后解析为同一个数组
function test(results) {
var defer = Q.defer();
foo('a')
.then(function (success) {
console.dir('success: ' + success);
return bar('test');
})
.then(function (rest) {
return foo('b')
})
.then(function(success){
results.push(success);
defer.resolve(results);
}, function(error){
defer.reject(error);
});
return defer.promise;
}
然后:
var resultsHolder = [];
test(resultsHolder).then(test).then(test)
.then(function(r){
// r === resultHoler
console.dir(r);
})