我有一个函数 foo 调用另一个函数 moreFoo 我希望在promises中包装函数调用,以便 foo moreFoo 解决后返回。这是我的解决方案:
function foo() {
var defer = $q.defer();
console.log('doing foo');
moreFoo().then(defer.resolve);
return defer.promise;
}
function moreFoo() {
var defer = $q.defer();
setTimeout(function() {
console.log('doing more foo');
defer.resolve();
}, 2000);
return defer.promise;
}
foo().then(function() {
console.log('finished with all foos');
});
然后输出:
doing foo doing more foo finished with all foos
它似乎按预期工作。这是将这些承诺联系起来的正确/最佳方式吗?
答案 0 :(得分:2)
我不知道“最好”,但通过利用$timeout
它所带来的承诺,这可以大大简化......
function foo() {
console.log('doing foo');
return moreFoo();
}
function moreFoo() {
return $timeout(function() {
console.log('doing more foo');
}, 2000);
}
foo().then(function() {
console.log('finished with all foos');
});
答案 1 :(得分:0)
我喜欢这种方式($ timeout返回promise):
function foo() {
return $timeout(function(){
console.log('doing foo');
},2000);
}
function moreFoo() {
return $timeout(function(){
console.log('doing more foo');
},2000);
}
foo()
.then(moreFoo)
.then(function(){
console.log('all foos done');
}, function() {
console.log('something went wrong');
});
此示例显示了两个链接在一起的承诺。第二个只在第一个成功后执行。如果失败,则调用最后一个错误处理程序。
答案 2 :(得分:0)
可以同时运行,甚至不需要使用$q.all()
$q.all([ foo(), moreFoo()]).then(function(data){
console.log(data) /* array of responses from all resolved promises */
});