Установка таймаута для обещания - PullRequest
0 голосов
/ 09 апреля 2019

Мне нужно обещание разрешить в течение указанного времени или отклонить его. Я делаю это:

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]);
}

... но время ожидания всегда истекает, что я делаю не так? По сути, мне нужно установить тайм-аут для обещания, чтобы оно разрешалось или отклонялось в течение maxWait мс.

1 Ответ

0 голосов
/ 09 апреля 2019

Вы должны иметь идентификаторы тайм-аута где-нибудь, где их может увидеть противоположное обещание.Затем, когда первое обещание разрешается, вы отменяете время ожидания other one.

Вот упрощенная версия без 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)

Это приведет к тому, что одно из обещаний никогда не будет выполнено, но до тех пор, пока у вас нет ссылки на , оно должно быть собрано для мусора .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...