@asdasdqwe

Являются ли промисы асинхронными?

Документация: помисы нужны, чтобы текущий стек не блокировался при ресурсоемких работ
new Promise(() => {
  console.log('много вычислений')
})

console.log('стек')


Результат:
много вычислений,
стек


Вместо обычного console.log('много вычислений') допустим код на 150 тыс строк. Ведь этот код блокирует стек

Всегда думал, что асинхронность - это когда часть кода (асинхронная) попадает в очередь, и выполняется ПОСЛЕ текущего стека

Код внутри промиса выполняется СРАЗУ же, а не после текущего стека
  • Вопрос задан
  • 153 просмотра
Решения вопроса 4
Seasle
@Seasle Куратор тега JavaScript
Плохо читали документацию.
new Promise((resolve) => resolve('много вычислений')).then(console.log);
console.log('стек');
// стек
// много вычислений

Ну и асинхронность, это не добавление в конец стека/event loop'а, а одновременное выполнение некоторой логики.
Ответ написан
Alexandroppolus
@Alexandroppolus
кодир
Вместо обычного console.log('много вычислений') допустим код на 150 тыс строк. Ведь этот код блокирует стек

Такое надо не в промис, а в воркер запихивать.

Либо разбивать на кусочки и эти кусочки последовательно через setTimeout
Ответ написан
Комментировать
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
new Promise(resolve => {
  // здесь код выполняется синхронно
  resolve();
}).then(() => {
  // здесь уже асинхронно, в ближайшем микротаске после вызова resolve выше
});

Promise.resolve().then(() => {
  // здесь тоже асинхронно, в ближайшем микротаске
});


много вычислений
Это не про асинхронность.
Асинхронность - это про кооперативную многозадачность, то есть промис может только отложить вычисления на потом, но они все равно заблокируют поток, который у JS всего один.
А для "много вычислений" без блокирования основного потока, эти "много вычислений" нужно выносить в отдельный поток. В JS для этого есть воркеры. А вот уже результат от воркера можно ждать асинхронно.
Ответ написан
Комментировать
А если так?
new Promise((resolve) => {
  resolve('много вычислений')
}).then((result) => 
console.log(result)); 
console.log("d");

Или проще
Promise.resolve('много вычислений').then((result) => console.log(result)); 
console.log("d");

Да, промисы попадают в очередь microQueue
https://developer.mozilla.org/en-US/docs/Web/JavaS...
https://developer.mozilla.org/en-US/docs/Web/API/H...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы