$q承诺不会解决
$q promise not resolving
我不明白为什么这个问题没有解决,有什么想法吗?"解决这个"确实打印出来了,但它永远不会回到承诺的分辨率。然后。
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
,就解决承诺可能是个好主意;那你就不用等那么久了。
相关文章:
- 如何在解决承诺之前和之后验证值
- EmberJS:在成功处理请求时解决承诺
- 蓝鸟没有正确解决承诺
- 使用 $http.post 和 res.redirect,而不解决承诺
- 如何在解决承诺后从承诺对象获取值
- 在解决承诺 AngularJS/ES6 后检索存储在服务中的数据
- CSV 完成读取后,如何解决承诺
- 茉莉花间谍和解决承诺
- 如何在轮询时不断解决Q承诺
- 拒绝并解决Q承诺
- 基于另一个承诺解决承诺
- 立即解决承诺
- 通过离子/ui路由解决承诺
- 我可以选择只在if语句的一部分中解决承诺吗
- 开玩笑-在测试前解决承诺
- 多次解决承诺
- 让双方都期待解决承诺
- 问美元.所有这些都在解决承诺之前被调用
- 在angular中解决承诺
- Angularjs单元测试解决承诺