Как работает Promise Chaining в памяти? - PullRequest
3 голосов
/ 17 марта 2019

function foo() {
  console.log('foo called')
  return Promise.resolve(5)
}
foo()
  .then(res => {
    console.log(res)
  })
console.log('hi')

Вывод на консоль:

1.) 'foo called'

2.) 'hi'

3.) 5

Мой главный вопрос заключается в том, что на самом деле происходит, когда поток глобального контекста выполнения завершается и извлекается из стека выполнения.Как JS / V8 узнает, где находится этот объект Promise в памяти, если объект Promise не назначен переменной в глобальном контексте выполнения?Как он узнает, где обновить значение обещания и вызвать функцию onfullfilment?

1 Ответ

2 голосов
/ 17 марта 2019

Глядя на исходный код V8 , мы видим, что при создании Promise , он привязан к текущему контексту выполнения, даже если вы не сохраняете его в переменная.

Node* const native_context = LoadNativeContext(context);
Node* const promise = AllocateAndInitJSPromise(context);

Глядя на , как реализуются обещания , мы видим, что цепочки разрешения Promise реализованы в виде простого связанного списка (выделено мое):

Объекты PromiseReaction образуют односвязный список [...] . В экземпляре JSPromise они связаны в обратном порядке и снова отображаются в правильном порядке при планировании их в очереди для микрозадач.

Вкратце, V8 связывает Promises с контекстом выполнения, даже если вы не сохраняете их в переменной, а цепочки Promise реализованы в виде связанных списков, что означает, что легко отследить, как только Promise действительно разрешится.


Для более общего понимания того, как асинхронные операции взаимодействуют друг с другом, посмотрите это видео Джейка Арчибальда в цикле событий Javascript.

...