为承诺设置超时

时间:2019-04-09 15:22:21

标签: javascript promise

我需要诺言在指定时间内解决或拒绝它。我正在这样做:

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内解决或拒绝。

1 个答案:

答案 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的引用。