Как ждать ответа перед запуском остальной части кода? - PullRequest
0 голосов
/ 14 июня 2019

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

В следующем коде, как только я получу ответ 200 OK, я хочу передать его в блок обещаний. Если я получу все элементы обещания Array, я бы хотел перенаправить страницу на другой URL.

В моем случае кажется, что код не останавливается в ожидании ответа. он зацикливается на запросе axios три раза, но вместо ожидания ответа он напрямую запускает секцию перенаправления.

Есть идеи?

 function test(){
  var response = undefined;
  var length = 3;
  var promiseArray = [];

  for(var a=0;a<length;a++){

        var link = 'https://'+hostname+'/';
        var apiUrl = 'api/xxx';
        var token = "123";

        axios.create({
            baseURL: link,
            timeout: 60000,
            headers: {
            Authorization: token
            }
        }).post(apiUrl, {
            ...
        }).then(res => {
            console.log(res);
            promiseArray.push(res);
        }).catch(err=>{
            console.log("err");
            console.log(err);
        });
  }


  response = await axios.all(promiseArray);
  if(response!=undefined){
      window.location.replace("https://"+hostname+"/abc");
  }
}

Ответы [ 3 ]

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

Вы хотели бы подождать все ответы, прежде чем перенаправить страницу, поэтому вам нужно использовать Promise.all ()

Этот следующий пример из MDN

var promise1 = Promise.resolve(3);
var promise2 = 42;
var promise3 = new Promise(function(resolve, reject) {
  setTimeout(resolve, 100, 'foo');
});

Promise.all([promise1, promise2, promise3]).then(function(values) {
  console.log(values);
});
// expected output: Array [3, 42, "foo"]
0 голосов
/ 14 июня 2019

Если вы уже используете async / await в одном месте, почему бы не использовать его везде:

 async function test(){
  var length = 3;

  for(var a=0; a<length; a++){

        var link = 'https://'+hostname+'/';
        var apiUrl = 'api/xxx';
        var token = "123";

        let res = await axios.create({
            baseURL: link,
            timeout: 60000,
            headers: {
                Authorization: token
            }
        }).post(apiUrl, {
            ...
        });
        /* Do whatever you need with res */
  }
  window.location.replace("https://"+hostname+"/abc");
}
0 голосов
/ 14 июня 2019

Это потому, что promiseArray пусто, вы отправляете результаты в него.Вставьте фактические обещания в массив.

async function test(){
  var response = undefined;
  var length = 3;
  var promiseArray = [];

  for(var a=0;a<length;a++){

        var link = 'https://'+hostname+'/';
        var apiUrl = 'api/xxx';
        var token = "123";

        promiseArray.push(
            axios.create({
                baseURL: link,
                timeout: 60000,
                headers: {
                Authorization: token
                }
            }).post(apiUrl, {
                ...
            })
        )
  }


  response = await axios.all(promiseArray);
  if(response!=undefined){
      window.location.replace("https://"+hostname+"/abc");
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...