Когда вы создаете новое 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 мс после запуска программы.