Принуждение функции к ожиданию завершения другой функции - PullRequest
0 голосов
/ 08 мая 2020

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

У меня есть функция (задача 3), которая должна выполняться только после функций до это финиш sh. Перед функциями (задача 1 и 2) есть дополнительные функции, которые извлекают данные из других источников, и время, необходимое для них, неизвестно. Функция ожидания не будет работать, потому что время для задач 1 и 2 может быть очень быстрым или очень медленным. Я попытался выполнить настройку async / await, но, должно быть, сделал это неправильно, потому что он всегда выполнял задачу 3 перед задачей 1 или 2. То же самое с функцией обратного вызова, которая на самом деле не выполняла обратный вызов, она просто выполняла задачу 1 и 2, а затем никогда не выполняла задачу 3.

function task1(input){
   // has more functions that do other stuff

}
function task2(input){
   // has more functions that do other stuff
}
function task3(input){
   // this code should only be executed after both task 1 and 2 finish
}

function main(input1, input2, input3){
    task1(input1); // doesn't matter which task finishes first between 1 and 2
    task2(input2);
    task3(input3); // task 3 should not be executed until task 1 and 2 have completed.
}

main(input1, input2, input3);

Если бы кто-нибудь мог помочь, был бы очень признателен.

Ответы [ 3 ]

0 голосов
/ 08 мая 2020

Вы хотите использовать обещания, если у вас асинхронный код. Promise.all () будет ждать их завершения перед запуском.

function task1() {
  return new Promise(function(resolve, reject) {
    console.log("task 1")
    setTimeout(function() {
      resolve('foo');
    }, Math.random() * 2000);
  })
}

function task2() {
  return new Promise(function(resolve, reject) {
    console.log("task 2")
    setTimeout(function() {
      resolve('bar');
    }, Math.random() * 2000);
  })
}

function task3() {
  console.log("task 3")
}

Promise.all([task1(), task2()]).then(function(values) {
  console.log(values);
  task3()
});

Поскольку вы сказали, что используете fetch, вы можете использовать это вместо обещаний, так как это возвращает обещание.

function task1() {
  return fetch('http://example.com/foo.json')
    .then(response => response.json())
}

function task2() {
  return fetch('http://example.com/bar.json')
    .then(response => response.json())
}

function task3() {
  console.log("task 3")
}

Promise.all([task1(), task2()]).then(function(values) {
  console.log(values);
  task3()
});
0 голосов
/ 08 мая 2020

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

const fetch = require('node-fetch')

async function task1(input){
  console.log(input)
  // API call goes here
  // const response = await fetch("http://localhost:5000/endpoint")
  console.log(response)
}
async function task2(input){
  console.log(input)
}
async function task3(input){
  console.log(input)
}

async function main(input1, input2, input3){
   await task1(input1); // doesn't matter which task finishes first between 1 and 2
   await task2(input2);
   await task3(input3); // task 3 should not be executed until task 1 and 2 have completed.
}

main("LIONS", "TIGERS", "BEARS")

Вы увидите приведенные выше результаты в:

LIONS
TIGERS
BEARS

, и все вызовы API будут происходить последовательно.

0 голосов
/ 08 мая 2020

Похоже, ваша среда поддерживает async / await. Предположим, что task1 и task2 либо равны async, либо возвращают Promise, тогда:

  1. Используйте await Promise.all, чтобы дождаться завершения двух задач. Это не приводит к принудительному выполнению какого-либо приказа, но гарантирует, что оба будут выполнены, прежде чем двигаться дальше.
  2. Позвоните task3.
    async function task1(input){
       // has more functions that do other stuff

    }
    async function task2(input){
       // has more functions that do other stuff
    }

    function task3(input){
       // this code should only be executed after both task 1 and 2 finish
    }

    async function main(input1, input2, input3){
        await Promise.all(
            task1(input1),
            task2(input2)
        )
        task3(input3);
    }

    main(input1, input2, input3);
...