Аксиос не возвращает обещание, не синхронно - PullRequest
0 голосов
/ 10 июня 2019

В моем приложении реагирования я выполняю вызов axios внутри каждого цикла, однако программа не ожидает ответа на запрос GET, а выполняет следующую часть программы. Когда это в конечном счете решает обещание, это слишком поздно. Как приостановить выполнение программы, пока axios не вернется из своего запроса.

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

Я попытался использовать параметры async / await, однако, похоже, это не сработало. Мне нужно, чтобы Аксиос работал синхронно.

pids.forEach((i1) => loadedContent.forEach((i2, idx) => {
  if (i1 === i2.available_versions.version[0].pid || i1 ===
    i2.versionPid) {
    axios.get(`https://programmes.api.hebel.com/dougi/api/versions?
    anshur${i1}`).then((response) => {
      xml2js.parseString(response.data, function(err, result) {
        loadedContent[idx].nCrid =
          result.gui.results[0].vastilp[0].roundup[0].identifier[0]._
        alert(loadedContent[idx].nCrid)
        //Need it to go into here, however it is bypassing this and 
        continuing
        //on to line 111
      });

    }).catch(e => {
      console.log('error', e);
    });

  }
}))

Я ожидаю, что axios будет работать синхронно или, по крайней мере, подождет, пока обещание не будет выполнено, прежде чем продолжить.

Ответы [ 2 ]

0 голосов
/ 10 июня 2019

Выполнение асинхронного вызова фактически приостановит выполнение, пока значение не станет доступным.Если ваша программа написана с помощью .then (), почему бы вам не попробовать ее с fetch?

0 голосов
/ 10 июня 2019

Вы можете использовать метод bluebirds Promise.map для синхронного выполнения асинхронного кода. Foreach - это синхронизированная функция, так что все в порядке, следующий цикл начинается до того, как закончится первый. Также вы можете использовать async await, чтобы выполнить его в правильном порядке. Вот как я сделаю это с async await и Promise.map:

await Promise.map(pids, async i1 => {
    await Promise.map(loadedContent, async (i2, idx) => {
        if (i1 === i2.available_versions.version[0].pid || i1 ===
            i2.versionPid) {
            const response = await axios.get(`https://programmes.api.hebel.com/dougi/api/versions?
            anshur${i1}`);
            xml2js.parseString(response.data, function (err, result) {
                loadedContent[idx].nCrid =
                    result.gui.results[0].vastilp[0].roundup[0].identifier[0]._
                alert(loadedContent[idx].nCrid)
            });
        });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...