Как ожидать определенного результата в функции при выполнении других функций - PullRequest
2 голосов
/ 05 марта 2019

Я хочу запустить некоторый код в ожидании другого ответа?

Пример:

var obj = {};

await pre(obj);
await first(obj);
await second(obj);
await third(obj);

await function pre(obj) {self.something = "something";}
await function first(obj){...something...}
await function second(obj){...something...}
await function third(obj){...Do something with obj...}

Что я не могу понять, так это как запустить pre () и выполнить задачу, требующую много времени, при выполнении first (), second () и third (), но третий будет запущен после завершения pre?

Ответы [ 3 ]

4 голосов
/ 06 марта 2019

Вы можете использовать Promise.all для параллельного выполнения всех промежуточных шагов перед запуском third:

var obj = {};

await Promise.all([ pre(obj), first(obj), second(obj)]);
await third(obj);

Если я правильно понимаю ваш вопрос, к тому времени, когда Promise.all закончится, obj будет содержать мутации запуска pre, first и second.

Будьте осторожны с обработкой ошибок, а также с недетерминированным доступом к объекту obj.

0 голосов
/ 06 марта 2019
var obj = {};

async function pre(obj) {self.something = "something";}
async function first(obj){...something...}
async function second(obj){...something...}
async function third(obj){...Do something with obj...}

// use array destructuring to get the responses after promises resolve
const [ preResponse, firstResponse, secondResponse ] = await Promise.all([
  pre(obj),
  first(obj),
  second(obj)
]);
const thirdResponse = await third(obj);
0 голосов
/ 06 марта 2019

Что я не могу понять, так это как запустить pre () и выполнить задачу, требующую много времени, при выполнении first (), second () и третьего (), но третий будет запущен после завершения pre?

Исходя из этого вопроса, я понимаю, что вы хотите:

  1. Выполнить pre, first и second одновременно
  2. Как только pre завершит выполнение, затем запустите third

Если это так, то следующий код сделает это:

var obj = {test: "Test"};

async function pre(obj) {console.log(`${pre.name} :`, obj); return obj;}
async function first(obj)  {console.log(`${first.name} :`, obj)}
async function second(obj) {console.log(`${second.name} :`, obj)}
async function third(obj)  {console.log(`${third.name} :`, obj)}

Promise.all([first(obj), second(obj), pre(obj).then(third)]);

Функция Promise.all() принимает массив функций, которые возвращают обещание, и выполняет их параллельно. Обратите внимание на pre(obj).then(third). Это выполнит функцию pre и после завершения выполнит функцию third.

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