下面的非功能性示例应该解释我尝试做什么,我只是不理解我需要用来完成它的模式。我试着谷歌搜索了解民意并推迟,但我找不到任何我能理解的东西。
我有一个轮询API的函数,我想在继续我的main函数之前等待该轮询返回预期结果(等待端点指示某些内容已经改变)。我做错了什么?
编辑:我应该补充说下面代码出错的地方是即使deferred.resolve()
最终被调用,但它似乎与返回的deferred
相同,因此,when
永远不会激活main()
。我猜测它与超时有关,意味着deferred
在第一次重复时遭到破坏。无论如何,这是我的假设。
function pollAPI() {
var deferred = $.Deferred();
$.ajax({
url: url,
contentType: 'application/JSON',
method: 'GET'
}).done(function(data){
if (!desiredResult) {
setTimeout(function() {
pollAPI();
}, 1000);
} else {
deferred.resolve();
}
}).error(deferred.reject());
return deferred.promise();
}
function main() {
$.when(pollAPI()).then(function() {
// do something now that the API has returned the expected result
});
答案 0 :(得分:3)
您可以使用对pollAPI()
函数的后续调用的链接来创建一个将其他链接到其上的单个承诺。这将是这样的:
// utility function to create a promise that is resolved after a delay
$.promiseDelay = function(t) {
return $.Deferred(function(def) {
setTimeout(def.resolve, t);
}).promise();
}
function pollAPI() {
return $.ajax({
url: url,
contentType: 'application/JSON',
method: 'GET'
}).then(function(data) {
// some logic here to test if we have desired result
if (!desiredResult) {
// chain the next promise onto it after a delay
return $.promiseDelay(1000).then(pollAPI);
} else {
// return resolved value
return someValue;
}
});
}
function main() {
pollAPI().then(function(result) {
// got desired result here
}, function(err) {
// ended with an error here
});
}
这有以下好处:
$.when()
。您可以直接在其上使用.then()
。.then()
(实际上它在jQuery 3.x中变得更加合法 - 虽然它适用于jQuery 1.x和2.x以及它自己的非标准怪癖)逻辑与其他产生许可的异步函数更兼容。此外,还有其他一些重试方法:Promise Retry Design Patterns