Как обрабатываются обещания JavaScript в среде выполнения - PullRequest
0 голосов
/ 15 июня 2019

Я пытаюсь выяснить, как обрабатываются обещания в среде выполнения. Перемещаются ли они в контейнер веб-API до тех пор, пока не разрешаются, а затем помещаются в стек вызовов при вызове .then? Вот пример кода. Console.log запускается до обещаний, которые заставляют меня поверить, что они оказываются в очереди. Я также заметил, что могу поместить функцию в .then, и возвращенное обещание заполнит параметры этой функции.

// asynchronous test
let promiseWhatever = new Promise( function(resolve, reject){

 // variable to be chained later and passed in function argument
  let chainedVariable = 'I am chained';
  resolve(chainedVariable);
  reject('rejected promise');
});

let promiseMe = function(promiseResult) {
  let message = `${promiseResult} to my computer`;
  return Promise.resolve(message); 
  // resolves here to be passed onto the second chained then
};


function hello() {


  promiseWhatever
  .then(promiseMe) 
  // how does promiseMe take in the result for its argument?

  // then returns another promise and you can chain them
  .then( function(fulfilled){
    console.log(fulfilled);
  }) // is fullfilling the code to display the string to the console.
  .catch( function(err) {
    console.log(err);
  });

  console.log('hello'); // logs first to the console

};

hello();

1 Ответ

0 голосов
/ 15 июня 2019

Во-первых, обещание - это просто схема уведомления.Базовая асинхронная операция (любой код разрешает или отклоняет обещание), которая обычно находится за пределами Javascript (с использованием собственного кода), такая как входящее сообщение webSocket, ответ ajax или что-то в этом роде.

Все механизмы обещаний используюточередь событий.Когда обещание разрешено, они публикуют событие в очереди событий, чтобы вызвать соответствующий обработчик .then() или .catch() для вызова.Это не требуется спецификацией языка или обещания, но ряд реализаций использует специальную очередь событий для обратных вызовов обещания, которая проверяется вместе с другими типами очередей событий.

Требуется, чтобы спецификация обещанияОбработчик .then() или .catch() всегда вызывается асинхронно ПОСЛЕ ТОГО, как код цикла текущего события завершен, даже если обещание разрешается немедленно.Вот почему ваш console.log('hello') показывает перед console.log() внутри обработчика .then().Это разработано и сделано для того, чтобы создать согласованность, когда обещание вызывает его обработчики (всегда после завершения текущего кода цикла событий).

Они перемещены в контейнер веб-API, пока не будут разрешеныи затем толкнул в стек вызовов, когда .then вызывается?

Когда обещание разрешено, событие добавляется в очередь событий, что приведет к вызову соответствующих обратных вызовов .then() после завершения текущего кода цикла событий (в будущем цикле цикла событий).

Непонятно, что вы подразумеваете под "контейнером веб-API", поэтому я не могу комментировать это.

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

Да, так работают обещания.Обработчику .then() передается единственный аргумент, представляющий разрешенное значение обещания.Обработчику .catch() передается единственный аргумент, представляющий причину отклонения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...