如何等待http请求完成? Java脚本

时间:2019-03-15 14:44:46

标签: javascript http ionic-framework request

我是Stack Overflow的新手,所以我希望我能找到能够解决我的问题的人。

发生了什么事:我目前正在使用ionic创建一个应用,并且我需要执行一些HTTP请求,因为我需要GoogleMaps中的数据。在那之前,我只使用很少的航路点,因此我只能执行一个请求,但是现在,由于我们的局限性,我必须执行其中的许多请求。

问题是,我尝试使用位置之间的距离填充矩阵,但是javascript是异步的,因此它不起作用...这是我的一段代码,仅供您理解,我尝试创建一个for循环以填充矩阵,我想找到一种方法来强制我的脚本等待每个请求的答案,然后再继续。

def sparse_cost_sensitive_loss (logits, labels, cost_matrix):
    batch_cost_matrix = tf.nn.embedding_lookup(cost_matrix, labels)
    eps = 1e-6
    probability = tf.clip_by_value(tf.nn.softmax(logits), eps, 1-eps)
    cost_values = tf.log(1-probability)*batch_cost_matrix
    loss = tf.reduce_mean(-tf.reduce_sum(cost_values, axis=1))
    return loss

httpB代表HTTP Bis,因为我创建了另一个,但这是一个基本的http请求。

如果我不清楚,请告诉我,谢谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您需要将所有Promise对象收集到一个数组中,然后使用Promise.all(theCollection).then(()=>{})

您没有在此处发布整个代码...所以我在猜测。以下代码将为您提供一些解决问题的方法。

var promises = [];
for (this.k = 0; this.k < this.adresses_split.length - 1; this.k ++){
    this.url = this.url1 + this.adresses_split[this.k] + this.url2 + this.phraseCl  + this.url3
    console.log(this.url)

    promises.push(
        this.httpB.get(this.url,{},{}).then(data =>{
            for ( this.i = 1; this.i < 4; this.i++ ){
                for(this.j = this.i + 1 + 3*this.k ; this.j< this.clients.length + 1; this.j++ ){
                    this.distances.push(this.i- 1 + 3*this.k);
                    this.distances.push(this.j - 1);
                    this.distances.push(data.data.split('elements')[this.i].split('duration')[this.j].split('value" : ')[1].split(' ')[0]);
                }
            } 
        }).catch(error => {
              console.log(error.status);
              this.teste=error.error; // error message as string
              console.log(error.headers);
        })
    );

}

Promise.all(promises).then(() => {
    ... do you stuff...
}

更新:针对您的评论-如果您希望一次查看和/或处理所有get请求的结果,请按以下方式更改代码:

var promises = [];
for (this.k = 0; this.k < this.adresses_split.length - 1; this.k ++){
    this.url = this.url1 + this.adresses_split[this.k] + this.url2 + this.phraseCl  + this.url3
    console.log(this.url)
    promises.push(this.httpB.get(this.url,{},{})
        .then(data => data)
        .catch(error => {
              console.log(error.status);
              this.teste=error.error; // error message as string
              console.log(error.headers);
        })
    );    
}

Promise.all(promises).then(results => {
    for(let r = 0; r < results.length; r++){
        let data = results[r];

        for(this.i=1; this.i < 4; this.i++){
            for(this.j = this.i + 1 + 3*this.k ; this.j< this.clients.length + 1; this.j++ ){
                this.distances.push(this.i- 1 + 3*this.k);
                this.distances.push(this.j - 1);
                this.distances.push(data.data.split('elements')[this.i].split('duration')[this.j].split('value" : ')[1].split(' ')[0]);
            }
        }
    }
});

注意:我没有测试上面的代码,因此可能会出现一些错误。希望对您有帮助。