我无法弄清楚为什么这不解决,有什么想法? “解决这个问题”确实打印出来了,但它永远不会让它回归到.then中的承诺的解决方案。
var promise = wait();
promise.then(function(result){
console.log("wait returned - " + result);
});
function wait(){
var deferred = $q.defer();
if(busy){
setTimeout(function(){
wait();
},500);
} else {
console.log("resolve this");
deferred.resolve("Wait is over.");
}
return deferred.promise;
};
答案 0 :(得分:1)
以下是如何做到的:
var promise = wait();
promise.then(function(result){
console.log("wait returned - " + result);
});
function wait(){
var deferred = $q.defer();
(function _wait() {
if (busy) {
setTimeout(_wait, 500);
} else {
console.log("resolve this");
deferred.resolve("Wait is over.");
}
})();
return deferred.promise;
};
关键区别在于,只有一个deferred
,由“'”包装器创建和返回。功能。延迟最终将由_wait
函数解决。
在您的情况下,每个后续(递归)wait()
调用都会创建一个不同的deferred
对象。其中一个对象最终将被解析 - 但是这将是第一个wait()
调用返回的同一个对象,只有此时busy
将为false。显然,大多数时候它都不会。
答案 1 :(得分:1)
每次调用wait时,都会生成 new 承诺。 wait
函数内对setTimeout
的调用对创建的第一个承诺没有任何作用。试试这个:
var promise = wait();
promise.then(function(result){
console.log("wait returned - " + result);
});
function wait(){
var deferred = $q.defer();
var timer = setInterval(function() {
if(!busy) {
clearInterval(timer);
console.log("resolve this");
deferred.resolve("Wait is over.");
}
}, 500);
return deferred.promise;
};
此外,根据您的程序其余部分的结构,一旦 busy
变为true
,最好立即解决承诺;然后你不必等待那么久。