Запускать asyn c вызовов по порядку - PullRequest
4 голосов
/ 27 мая 2020

У меня сейчас есть код, который выглядит так:

const a = await function1();
const b = await function2();
const c = await function3();

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

[const a, const b, const c] = await Promise.all([function1, function2, function3)]

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

Есть ли способ использовать Promise.all, который не ждет завершения каждой функции, но сохраняет порядок вызовов?

1 Ответ

2 голосов
/ 27 мая 2020

Если вы выполните:

const [a, b, c] = await Promise.all([function1(), function2(), function3()];

, сначала будет выполняться синхронная часть function1, затем синхронная часть function2, а затем синхронная часть function3. В этот момент они участвуют в гонке за завершение. Независимо от порядка, в котором они заполняются, вы получите результаты по порядку (a - результат function1, b из function2, и c.).

Если сервер требует, чтобы асинхронная часть function1 fini sh перед запуском function2, тогда вы должны использовать свой исходный код. Единственный элемент управления, который у вас есть в коде на стороне клиента, - это когда процессы запускаются .

Однако , это не означает, что их нельзя немного оптимизировать. , но это во многом зависит от того, что они делают. Например, если важно то, что вы получаете заголовки , отправленные в ответ на запрос function1, перед запуском function2, но function1 выполняет дальнейшую обработку после получения заголовков (например, читая и делая что-то с телом ответа), вы можете оптимизировать это, но разделив function1 на две части: часть, которая запускает процесс и использует заголовки, и часть, которая потребляет тело и что-то делает с ним.

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

// Do the first part in series
const r1 = await function1PartA();
const r2 = await function2PartA();
const r3 = await function3PartA();
// Do the remainder in parallel
const [a, b, c] = await Promise.all([
    function1PartB(r1),
    function2PartB(r2),
    function3PartB(r3)
]);
...