В чем разница между "затем блоком" и "потом обработчиком" в обещании JavaScript?
В документации обещаний в javascript по этой ссылке. Это написано:
с помощью разрешенного обещания блок "then" будет запущен мгновенно, но его обработчики будут запущены асинхронно
// using a resolved promise, the 'then' block will be triggered instantly,
// but its handlers will be triggered asynchronously as demonstrated by the console.logs
var resolvedProm = Promise.resolve(33);
var thenProm = resolvedProm.then(function(value){
console.log("this gets called after the end of the main stack. the value
received and returned is: " + value);
return value;
});
// instantly logging the value of thenProm
console.log(thenProm);
// using setTimeout we can postpone the execution of a function to the moment
// the stack is empty
setTimeout(function(){
console.log(thenProm);
});
// logs, in order:
// Promise {[[PromiseStatus]]: "pending", [[PromiseValue]]: undefined}
// "this gets called after the end of the main stack. the value received and returned is: 33"
// Promise {[[PromiseStatus]]: "resolved", [[PromiseValue]]: 33}
Я не совсем понимаю ту часть, в которой говорится, что блок будет запущен, но обработчики запускаются асинхронно. Мои вопросы:
Что такое тогда блок? Что это за обработчик и чем они отличаются?
Что вызывает каждый?
- Когда происходит этот асинхронный триггер, он все-таки разрешается
Спасибо.
2 ответа
Это предложение немного сбивает с толку, вот моя попытка объяснить, что я думаю, что это значит. Пожалуйста, не стесняйтесь бросать камни в меня, если я где-то ошибся:)
.then()
Метод возвращает обещание. Я думаю, что the 'then' block will be triggered instantly
это означает, что .then
Метод запускается в текущем цикле цикла обработки событий и немедленно возвращает обещание. Однако обратные вызовы, которые вы передаете then
метод выполняется асинхронно, т. е. при следующем запуске цикла событий.
Итак, в этом примере первая записанная строка
Promise {[[PromiseStatus]]: "pending", [[PromiseValue]]: undefined}
потому что это:
var thenProm = resolvedProm.then(function(value){
console.log("this gets called after the end of the main stack. the value
received and returned is: " + value);
return value; });
выполняется, и обещание возвращается, но обратные вызовы, которые возвращают значение, еще не выполнены, поэтому значение не определено.
После завершения цикла обработки событий начинается следующий и выполняется обратный вызов. Этот обратный вызов присваивает значение обещанию и регистрирует эту строку:
"Это вызывается после окончания основного стека. Полученное и возвращенное значение: 33"
Наконец, само обещание регистрируется с новым назначенным значением:
Обещание {[[PromiseStatus]]: "решено", [[PromiseValue]]: 33}
Чтобы ответить на ваши вопросы более прямо тогда:
Then
метод Promise, который принимает функцию (и) обратного вызова и возвращает другое обещание. Эта функция будет запущена, когда исходное обещание будет разрешено.- Когда исходное обещание разрешается или отклоняется, это вызывает функцию обратного вызова, переданную в методе then. Ничего "триггера"
.then()
сам метод, это просто метод. - Разрешение обещания - это то, что вызывает обратный вызов.
Как сказал @Bergi, источником путаницы, вероятно, является слово "блок", которое здесь, вероятно, просто означает "кусок кода внутри .then
вызов метода."
- Затем блок - это метод объекта Promise. Он используется для регистрации обратных вызовов, которые будут вызываться в случае выполнения или отклонения Promise.
- Первый запуск по времени при создании экземпляра Promise. Обработчик будет вызван, когда Promise будет решен или отклонен