Порядок обещания в javascript

Если я вызываю функцию, которая возвращает объект Promise, последовательно несколько раз порядок выполнения этих асинхронных операций будет таким же, как порядок, в котором были созданы объекты Promise?

Я так не думаю, тот, кто решит проблему первым, вернется первым, и это не обязательно будет вызвано первым.

Ivan 02.06.2018 18:57

Нет, порядок не будет прежним

Zohaib Ijaz 02.06.2018 19:06

Полагаю, это первый пришел первый обслужен

KooiInc 02.06.2018 19:07

Он спрашивает не об этом, и ответ - да, порядок будет таким же, но когда они будут закончены, не будет прежним.

vol7ron 02.06.2018 19:19

Это во многом зависит от реализации вызываемой функции. Нет, обещания обычно не дают такой гарантии.

Bergi 02.06.2018 19:35

Я понимаю, что JS является однопоточным. Итак, если необходимо выполнить несколько асинхронных операций, значит ли это, что они поставлены в очередь и выполняются одна за другой, ИЛИ это то, что JS переключит поток с одной операции на другую?

Mandroid 02.06.2018 19:39

Если вы создаете обещание на основе действия пользователя (скажем, кнопку фильтра), а затем просто устанавливаете пользовательский интерфейс с результатом по мере их поступления (обещания разрешаются), тогда у вас есть проблема. Пользователь может выбрать ABC, но обещает разрешить ACB, поэтому последним действием пользователя было C, но пользовательский интерфейс показывает B. Обычный (плохой) способ справиться с этим - запретить пользователю что-либо делать, пока не будет выполнено обещание. Однако вы можете позволить пользователю делать то, что они хотят, и устанавливать пользовательский интерфейс только в том случае, если это было последнее запущенное обещание с что-то вроде этого.

HMR 02.06.2018 21:10

Даже если ваш код работает в одном потоке, когда вы делаете что-то вроде fetch(url);fetch(url), может быть несколько потоков (параллельных), потому что метод выборки является родным.

HMR 02.06.2018 21:12
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
8
49
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Ответ принят как подходящий

Это зависит от реализации функции и того, что вы подразумеваете под «выполнением этих асинхронных операций».

Обычно функция, возвращающая обещание, синхронно запускает асинхронную операцию, и все, что она делает: Начинать операцию. Затем операция продолжается и завершается независимо от функции, которая ее запустила.

Итак, если вы сделаете это:

var p1 = foo(1);
var p2 = foo(2);
var p3 = foo(3);

... и foo синхронно запускает асинхронную операцию, когда вы ее вызываете, тогда да, асинхронные операции будут начал в том порядке, в котором были созданы обещания.

Это не означает, что они продолжаются или завершаются в этом порядке, а на самом деле они могут и не работать. Это зависит от рассматриваемых операций.

Пример:

function foo(value) {
  return new Promise(resolve => {
    console.info("starting " + value);
    setTimeout(function() {
      console.info("completing " + value);
      resolve(value);
    }, value == 2 ? 800 : 200);
  });
}
var p1 = foo(1);
var p2 = foo(2);
var p3 = foo(3);
// Naturaly, in real code, we'd have error handlers on those

foo запускает операции по порядку, но они завершаются не по порядку, потому что операция для 2 занимает больше времени, чем операции для 1 и 3.

Другие вопросы по теме