Реализация однопотокового программирования на 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 для передачи данных в "обратный вызов".