Javascript $q承诺不解决问题
我不明白这为什么不能解决,有什么想法吗?“解决这个问题”确实会打印出来,但它永远不会回到中承诺的解决方案Javascript $q承诺不解决问题,javascript,angularjs,angular-promise,Javascript,Angularjs,Angular Promise,我不明白这为什么不能解决,有什么想法吗?“解决这个问题”确实会打印出来,但它永远不会回到中承诺的解决方案 var promise = wait(); promise.then(function(result){ console.log("wait returned - " + result); }); function wait(){ var deferred = $q.defer(); if(busy){ setTimeout(function
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;
};
以下是如何做到这一点:
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;
};
关键区别在于,只有一个由“包装器”函数创建和返回的延迟的。此延迟最终将由\u wait
函数解决
在您的情况下,每个后续(递归)wait()
调用都会创建一个不同的延迟对象。这些对象中的一个最终将被解析,对吗?但只有当此时busy
为false时,它才是第一个wait()
调用返回的同一个对象。显然,大多数情况下不会。每次你打电话给wait,它都会做出新的承诺。在setTimeout
函数中对wait
的调用对创建的第一个承诺没有任何影响。请尝试以下方法:
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
时尽快解决承诺问题;那么你就不必等那么久。有什么变化busy
?无论如何,每次后续的wait
调用都会创建一个新的延迟对象,但显然只返回第一次调用的延迟对象。每次调用wait
Busy时,都会返回不同的承诺,这只是在其他地方设置的标志。我没想过每次打电话都要做出承诺…嗯。谢谢