Выполните два вызова функции синхронно, когда 1 делает http GET - PullRequest
0 голосов
/ 26 июня 2019

Я пытаюсь сделать несколько вызовов функций, которые будут собирать информацию, а затем действовать в соответствии с этой информацией.Некоторые вызовы делают HTTP-запросы, которые являются медленными.Другие гораздо быстрее.

Все мои вызовы функций работают и собирают необходимые данные, но мне нужно подождать HTTP-запрос, прежде чем двигаться вперед.

Я пробовал обещания, async / awaitи т.д.

const http = require('http');

async function operation() {
    return new Promise(function(resolve, reject) {
      const url = 'http://www.google.com';
      http.get(url, (resp) => {
        let data = '';
        resp.on('data', (chunk) => {
          data += chunk;
        });
        resp.on('end', () => {
          resolve(resp.statusCode);
        });
      }).on("error", (err) => {
        reject(err);
      });
    })
}

async function app() {
    var a = await operation()
    console.log('a: ', a) // this returns 200
}

function test() {
  console.log('test: ','THIS SHOULD COME AFTER')
}


app()
test()

Мне нужен результат функции test, следующий за app.Я вижу печать "ЭТО ДОЛЖНО ПОЙДЕТСЯ" до 200

1 Ответ

1 голос
/ 26 июня 2019

Как я уже упоминал в комментариях, app - это асинхронная функция, тогда как проверка синхронна.Это означает, что если вы позвоните app(); test(); test, он всегда будет завершен до разрешения app.Однако имейте в виду, что Promises в конечном итоге resolve или reject.

Это означает, что для вызова синхронной функции после асинхронного вам необходимо либо вызвать test в пределах app,вот так:

async function app() {
  //add try-catch to handle rejection of promise
  try {
    var a = await operation()
    console.log('a: ', a) // this returns 200
    // now you can call test after app
    test();
  } catch (err) {
    //handle error case to trigger rejection of promise
    throw new Error(err)
  }
}

или помните, что Promises являются thenable:

app()
.then(someReturnedValue => test())
.catch(err => /*handle errors*/)

Вы упоминаете в комментариях, что у вас есть несколько app -подобных функций, которые будутагрегируется до test.Вы можете рассмотреть возможность использования Promise.all, который принимает массив Promises и возвращает массив данных, соответствующий каждому разрешенному Обещанию, или обнаруживает ошибку, если какое-либо из Обещаний отклоняется.

Promise.all([app, app1, app2])
.then(arrayOfReturnedValues => test())
.catch(err => /*handle errors*/)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...