Javascript реализация однопотокового программирования - PullRequest
0 голосов
/ 30 ноября 2018

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

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

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

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

0 голосов
/ 30 ноября 2018

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

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