Реализация однопотокового программирования на Javascript

Я знаю, что javascrip - это однопоточное приложение. Я думаю, что для реализации асинхронного программирования он выполняет различные части программы синхронно.

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

2 ответа

Нет. Текущая очередь кода будет запущена, прежде чем вернуться к выполнению обещаний. Это включает в себя метод "тогда".

Обещания используют "стиль продолжения прохождения" ("CPS").

Подход узла к CPS состоит в том, что асинхронные функции принимают обратные вызовы. Вот так:

const FS = require('fs')
FS.readFile( path, 'utf8', function callback(error, data) {
  // FS.readFile will invoke this function with an error or the file contents
  // once the read operation is complete
})

Явное обещание (т.е. нет async/await), выглядит довольно похоже:

const myPromise = new Promise(function callback(resolve, reject) {
    // invoke the non-blocking thing, then use resolve or reject to pass something onward
} )

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

Обещания часто выглядят похожими, по крайней мере, внешне. Полифилы Promise (которые часто не нужны) в буквальном смысле работают, используя некий волшебный, но немагический код CPS, а также таймауты или события, чтобы обеспечить тот же интерфейс. Я подозреваю, что современные движки JS используют какой-то механизм более низкого уровня, который не опирается на CPS для передачи данных в "обратный вызов".

Другие вопросы по тегам