как setTimeout работает в обещании в JavaScript? - PullRequest
0 голосов
/ 16 ноября 2018

У меня вопрос, я не знаю, как setTimeout работает в обещании, мне нужно таймер:

const start = new Date().getTime();
function a() {
  setTimeout(() => {
    console.log('output', new Date().getTime() - start);
  }, 3000);
}

setTimeout(a, 1000);

вывод: 4000

затем я изменяю свой код следующим образом:

const start = new Date().getTime();
const p13 = new Promise((resolve,reject) => {
  setTimeout(() => {
    reject(new Error('error'));
  },3000);
});

const p14 = new Promise((resolve,reject) => {
  const s = new Date().getTime();
  setTimeout(() => {
    resolve(p13);
  },1000);
});

p14.then((value) => {
  console.log(value, 'value');
}).catch((error) => {
  const end = new Date().getTime();
  console.log('output:', end - start);
});

выход: 3000, я не знаю почему?должно вывести 4000. почему 3000.

Ответы [ 4 ]

0 голосов
/ 16 ноября 2018

При t = 0

  • создается обещание p13, которое начинается timeout1 со временем ожидания 3 с
  • создается обещание p14, которое начинается timeout2 со временем ожидания 1 с

При t = 1000

  • timeout2 запускает функцию обратного вызова, связывая p14 с обещанием p13
  • timeout1 пройдено 1000 мс

При t = 3000

  • timeout1 запускает функцию обратного вызова, отклоняет обещание и вывод вычисляется

Давайте рассмотрим другой пример

const start = new Date().getTime();
const p13 = new Promise((resolve,reject) => {
  setTimeout(() => {
    const end = new Date().getTime();
    console.log('output:', end - start);
    reject(new Error('error'));
  },3000);
});

const p14 = new Promise((resolve,reject) => {
  const s = new Date().getTime();
  setTimeout(() => {
    resolve(p13);
  },1000);
});

setTimeout(function(){
  p14.then((value) => {
    console.log(value, 'value');
  }).catch((error) => {
    console.log('error');
  });
}, 5000);

Как видно из приведенного выше примера, тайм-аут обещания p13 срабатывает даже до выполнения обратного вызова setTimeout с задержкой 5000 мс.

Заключение - При создании объекта promise состояние объекта обещания находится в состоянии ожидания, однако фактическая функциональность срабатывает.

0 голосов
/ 16 ноября 2018

вот как бы вы сделали это 4000

сделать p13 функцией

Решимость (p13 ());

теперь вы не запускаете p13, пока p14 не "завершится"

const start = new Date().getTime();
const p13 = () => new Promise((resolve,reject) => {
  setTimeout(() => {
    reject(new Error('error'));
  },3000);
});

const p14 = new Promise((resolve,reject) => {
  const s = new Date().getTime();
  setTimeout(() => {
    resolve(p13());
  },1000);
});

p14.then((value) => {
  console.log(value, 'value');
}).catch((error) => {
  const end = new Date().getTime();
  console.log('output:', end - start);
});
0 голосов
/ 16 ноября 2018

Когда вы создаете новое Promise, функция, которую вы передаете в качестве аргумента конструктора, выполняется немедленно.Таким образом, тайм-аут p13 вызовет отклонение через 3000 мс после создания Promise, а не через 3000 мс после его передачи в функцию resolve.Если вы хотите, чтобы ваши Обещания выполнялись одно за другим, вы можете изменить свой код на что-то вроде этого:

const start = new Date().getTime();
const p13 = () => {
    return new Promise((resolve,reject) => {
        setTimeout(() => {
            reject(new Error('error'));
        },3000);
    });
}

const p14 = new Promise((resolve,reject) => {
    const s = new Date().getTime();
    setTimeout(() => {
        resolve(p13());
    },1000);
});

p14.then((value) => {
    console.log(value, 'value');
}).catch((error) => {
    const end = new Date().getTime();
    console.log('output:', end - start);
});

p13 теперь является функцией, которая создает Обещание.Эта функция выполняется через 1000 мс, новое Обещание создается и возвращается, и запланировано другое время ожидания.Второй тайм-аут отклоняет обещание еще через 3000 мс, а значит через 4000 мс после запуска программы.

0 голосов
/ 16 ноября 2018

Обещания с вашими тайм-аутами являются асинхронными.

Когда вы создаете p13, он непосредственно начинает свой тайм-аут, который равен 3000. Он не ждет 1000 от p14.(это то, что вы думаете)

С более подробной информацией о вашем коде ожидаемый результат:

  • Если вы введете любое число меньше 3000 в p14, оно разрешится с 300x.Если вы поставите более 4000, то он будет отклонен.(хотя тайм-аут не такой точный, поэтому он больше равен 3000/4000)
...