#javascript #promise #es6-promise
Вопрос:
Я немного узнал об обещаниях и наткнулся на этот пример, но не совсем понимаю, как он работает. Может ли кто-нибудь помочь разбить это на этапы, чтобы я мог понять, пожалуйста, меня в основном бросает параметр отмены и то, как он используется. Я тоже пробовал запускать код в консоли, но я все еще в замешательстве. Спасибо.
const wait = (
time,
cancel = Promise.reject()
) => new Promise((resolve, reject) => {
const timer = setTimeout(resolve, time);
const noop = () => {};
cancel.then(() => {
clearTimeout(timer);
reject(new Error('Cancelled'));
}, noop);
});
const shouldCancel = Promise.resolve(); // Yes, cancel
// const shouldCancel = Promise.reject(); // No cancel
wait(2000, shouldCancel).then(
() => console.log('Hello!'),
(e) => console.log(e) // [Error: Cancelled]
);
Ответ №1:
Для начала Promise.resolve()
возвращает объект Promise, который разрешен. Аналогично, Promise.reject()
возвращает отклоненный объект Promise.
cancel
Переменная содержит отклоненный или разрешенный объект Promise (отклоненное обещание по умолчанию).
В случае, если объект Promise внутри cancel
разрешен, он немедленно очистит таймер, установленный в timer
переменной, и отклонит родительское обещание. Вы можете увидеть это в комментарии к этой строке:
const shouldCancel = Promise.resolve(); // Yes, cancel
В случае, если объект Promise внутри cancel
отклонен, он не очистит таймер, так как он не сможет запустить строки кода, в которых таймер очищен, и вместо этого запустит noop
функцию, которая является пустой функцией без операций. Таким образом, это позволит таймеру следовать своему курсу и, наконец, выполнить родительское обещание. Вы можете увидеть это в комментарии к этой строке:
// const shouldCancel = Promise.reject(); // No cancel
Таким образом, таймер будет следовать своему естественному курсу, если shouldCancel = Promise.reject()
и вернет решенное обещание. Если shouldCancel = Promise.resolve()
, таймер будет отменен, и Обещание будет отклонено.
Комментарии:
1. спасибо, я думаю, что теперь я понимаю немного больше, но почему в случае, когда обещание отмены отклонено и выполняется функция noop, она ожидает разрешения родительского обещания, а не возвращает неопределенное обратно во внешнюю функцию «тогда», аналогично тому, когда обещание отмены разрешено, таймер очищен и вызывается функция отклонения? В этом случае он не ждет, пока родительское обещание будет отклонено, не так ли?
2. Также интересно, что строка «отменено» не регистрируется в функции outside then onReject, я не понимаю, почему это так.
3. Обещание возвращается только после того, как оно будет выполнено или отклонено. Поскольку
noop
функция не выполняет ни того, ни другого, обещание ожидает окончания таймера, прежде чем оно будет окончательно решено4. Более поздняя часть, в которой говорится
console.log(e)
, предназначена только для запуска, когда обещание отклонено. Этот.then()
синтаксис принимает две функции обратного вызова, первая из которых вызывается только в том случае, если обещание выполнено. Второй вызывается только в том случае, если Обещание отклонено