В чем разница между "затем блоком" и "потом обработчиком" в обещании 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}

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

  1. Что такое тогда блок? Что это за обработчик и чем они отличаются?

  2. Что вызывает каждый?

  3. Когда происходит этот асинхронный триггер, он все-таки разрешается

Спасибо.

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}

Чтобы ответить на ваши вопросы более прямо тогда:

  1. Then метод Promise, который принимает функцию (и) обратного вызова и возвращает другое обещание. Эта функция будет запущена, когда исходное обещание будет разрешено.
  2. Когда исходное обещание разрешается или отклоняется, это вызывает функцию обратного вызова, переданную в методе then. Ничего "триггера" .then() сам метод, это просто метод.
  3. Разрешение обещания - это то, что вызывает обратный вызов.

Как сказал @Bergi, источником путаницы, вероятно, является слово "блок", которое здесь, вероятно, просто означает "кусок кода внутри .then вызов метода."

  1. Затем блок - это метод объекта Promise. Он используется для регистрации обратных вызовов, которые будут вызываться в случае выполнения или отклонения Promise.
  2. Первый запуск по времени при создании экземпляра Promise. Обработчик будет вызван, когда Promise будет решен или отклонен
Другие вопросы по тегам