Обещания используют "стиль передачи продолжения" ("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 для передачи данных в «обратный вызов».