如何在运行其余代码之前等待响应?

时间:2019-06-14 08:53:12

标签: javascript axios

我想运行axios请求循环,调用后端,并在重定向页面之前等待所有响应。

在下面的代码中,一旦收到200 OK的响应,我想将其推送到promiseArray。如果收到所有promiseArray项,则要将页面重定向到另一个URL。

就我而言,似乎代码并没有真正停止等待响应。它为axios请求循环了3次,但是它没有等待响应,而是直接运行重定向部分。

有什么主意吗?

 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 :(得分:0)

那是因为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");
  }
}

答案 1 :(得分:0)

您希望在重定向页面之前等待所有响应,因此您需要使用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"]

答案 2 :(得分:0)

如果您已经在一个地方使用class Doughnut { final String name; final String filling; final String topping; final double price; Doughnut(this.name, this.filling, this.topping, this.price); Doughnut.fromJson(Map<String, dynamic> json) : name = json['name'], filling = json['filling'], topping = json['topping'], price = json['price']; Map<String, dynamic> toJson() => { 'name' : name, 'filling' : filling, 'topping' : topping, 'price' : price }; } ,为什么不在所有地方使用它:

async / await