$ q承诺不解决

时间:2014-10-16 16:50:04

标签: javascript angularjs angular-promise

我无法弄清楚为什么这不解决,有什么想法? “解决这个问题”确实打印出来了,但它永远不会让它回归到.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; 
}; 

2 个答案:

答案 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,最好立即解决承诺;然后你不必等待那么久。