Когда вы делаете эту структуру:
return new Promise(resolve => {
// run some long synchronous piece of code
resolve(...);
});
Вот что происходит.
- Создается новый объект обещания
- Обратный вызов исполнителя обещания вызывается синхроннокак часть выполнения конструктора обещаний
- Ваш долго выполняющийся синхронный код называется omback callback исполнителя
- Вы вызываете
resolve(...)
для разрешения ранее созданного обещания - Вы возвращаетеот исполнителя обещаний
- Конструктор обещаний возвращает
- Вы вернетесь из функции хоста и строка кода после этого вызова функции будет запущена
- Некоторое время спустя (после того, кактекущая часть Javascript возвращает управление обратно в систему), обработчики
.then()
вызываются в предыдущем обещании.
Итак, обещание синхронно вызывает обратный вызов исполнителя.Это не позволяет вам «запускать что-либо в фоновом режиме».Javascript все еще однопоточный.
Невозможно использовать обещание, чтобы превратить синхронный код в асинхронный код.Вы можете использовать некоторые методы обещаний, чтобы изменить расписание выполнения кода, но синхронный код в Javascript по-прежнему является синхронным и блокирует код в Javascript независимо от того, когда он выполняется.
Обещания - это просто система уведомлений для уведомления вас, когдакакая-то другая операция дала обещание, что теперь она решена или отклонена.Они магическим образом не преобразуют синхронный код в асинхронный код.
Итак, суть в том, что вы не можете использовать обещания взять синхронную долгосрочную функцию initialize()
и каким-то образом сделать ее неблокирующей или асинхронной.
Какой правильный способ убедиться, что все идет так, как ожидалось, с одновременным запуском nextThing.initialize () и this.doB (),
Если nextThing.initialize()
синхронный и блокирующий, он не может работать одновременно ни с чем.node.js запускает ваш Javascript однопоточным.Одна часть Javascript работает одновременно.Обещания не могут это изменить.
и запуск this.doC () сразу после того, как разрешается this.doB ()
, поскольку this.doB()
и this.doC()
оба возвращаютОбещания, затем вы объединяете обещания в цепочку обработчиков .then()
для последовательности этих операций.Ваш код, кажется, уже делает это.
Для получения информации об опциях для выгрузки долго выполняющегося синхронного кода вне текущего потока Javascript для node.js, см. Этот другой ответ:
Сделайте функцию, требующую больших затрат времени, асинхронной
К вашему сведению, возможно, это просто псевдокод, но нет никаких причин для этого:
return new Promise((resolve) => resolve());
Вместо этого вы можете просто сделать:
return Promise.resolve();.