Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/450.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript $q承诺不解决问题_Javascript_Angularjs_Angular Promise - Fatal编程技术网

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时,都会返回不同的承诺,这只是在其他地方设置的标志。我没想过每次打电话都要做出承诺…嗯。谢谢