$q承诺不会解决

$q promise not resolving

本文关键字:解决 承诺      更新时间:2023-09-26

我不明白为什么这个问题没有解决,有什么想法吗?"解决这个"确实打印出来了,但它永远不会回到承诺的分辨率。然后。

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;
};

关键区别在于只有一个deferred,由"wrapper"函数创建并返回。此延迟将最终由_wait函数解决。

在您的情况下,每个后续(递归)wait()调用都会创建一个不同的deferred对象。其中一个对象最终会被解析,对吧,但只有当busy此时为false时,它才会与第一个wait()调用返回的对象相同。显然,大多数时候都不会。

每次调用wait时,它都会做出一个新的承诺。setTimeout函数中对wait的调用对创建的第一个promise没有任何作用。试试这个:

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,就解决承诺可能是个好主意;那你就不用等那么久了。