我需要诺言在指定时间内解决或拒绝它。我正在这样做:
function myFunction(url, maxWait) {
maxWait = maxWait || 5000; // milliseconds
var promise = new Promise(function(resolve, reject) {
$.ajax({
url: url,
})
.done(function(data) {
resolve(data);
});
});
var timeout = new Promise(function(resolve, reject) {
var id = setTimeout(function() {
clearTimeout(id);
reject(Error("Timed out"));
}, maxWait);
});
return Promise.race([promise, timeout]);
}
...但是超时总是运行,我在做什么错?基本上,我需要为Promise设置超时时间,以便它在maxWait
ms内解决或拒绝。
答案 0 :(得分:0)
您需要在相反的诺言可以看到它们的地方放置超时ID。然后,当第一个承诺解决时,您取消另一个一个的超时。
这是没有ajax的简化版本:
function myFunction() {
var id1, id2 // ids in outer scope
var timeout1 = new Promise(function(resolve, reject) {
id1 = setTimeout(function() {
clearTimeout(id2); // clear the *other* timeout
resolve("Timed out2");
}, 1000);
});
var timeout2 = new Promise(function(resolve, reject) {
id2 = setTimeout(function() {
console.log("timeout finished")
clearTimeout(id1);
reject(Error("Timed out"));
}, 1500);
});
return Promise.race([timeout1, timeout2]);
}
myFunction().then(console.log).catch(console.log)
这将导致其中一项承诺永远无法解决,但前提是您不持有对it should be garbage collected的引用。