假设我有2个承诺promise1, promise2
,它们会异步地做一些事情。
promise2依赖于promise1在运行之前完成。这很容易。
function runPromises(){
return promise1().done(function(){
promise2();
});
}
问题是我也想知道他们什么时候都完成了。
runPromises().done(function(){
alert("promise 1 and 2 done");
});
当promise1不同时执行时,runPromises会发出警报。
答案 0 :(得分:2)
以下是使用两个名为process1和process2的简单函数的示例。这些函数关闭并异步执行某些操作(在这种情况下,我只是使用setTimeout来模拟这个)并返回promises(使用q库)。流程1运行,然后流程2运行,当流程2返回时,有空间做某事。希望这会有所帮助:
var process1 = function() {
var deferred = q.defer();
setTimeout(function() {
deferred.resolve();
}, 10);
return deferred.promise;
};
var process2 = function() {
var deferred = q.defer();
setTimeout(function() {
deferred.resolve();
}, 10);
return deferred.promise;
};
process1()
.then(process2)
.then(function() {
// Process 1 and 2 have completed
});
答案 1 :(得分:1)
要链接承诺操作,并获得第二个结果的承诺(即两者都完成后),请使用then
方法而不是done
:
function runPromises(){
return promise1().then(function(){
// ^^^^
return promise2();
// ^^^^^^ always return promise from async functions like this callback
});
}
如果您不关心这些论点,您甚至可以将其缩短为return promise1().then(promise2);
。
答案 2 :(得分:0)
使用then
链接承诺:
promise1().then(promise2).then(promise3).done(function(){
alert("promise 1 and 2 and 3 done");
});
<强>编辑:强>
function runPromises(){
return promise1().then(promise2).then(promise3);
}
runPromises().done(function(){console.log('all done!')});
答案 3 :(得分:-3)
典型的,我尝试了30分钟,试图在发布问题之前找到解决方案,但现在我找到了答案。
我可以通过新建$ .Deferred();
来做到这一点function runPromises(){
var d1 = new $.Deferred();
promise1().done(function(){
promise2().done(function(){
d1.resolve();
};
});
return d1.promise();
}
runPromises().done(function(){
alert("promise 1 and 2 done");
});