gpt4 book ai didi

javascript - 循环内的 Http 请求

转载 作者:搜寻专家 更新时间:2023-10-31 23:32:37 27 4
gpt4 key购买 nike

我在循环内发出 HTTP 请求时遇到了一些麻烦。

让我解释一下我有什么......

我创建了一个 http GET 来检索一些值,然后我需要为我刚刚从第一个请求中获取的每对值创建另一个 HTTP GET。

这两个调用没问题,如果我切断 for 循环并尝试运行整个请求链,它会完美运行,但只有一次,因为我删除了循环。我怎样才能让它发挥作用?

代码如下:

request({
url: "some_url",
method: "GET",
json:true,
headers:[{'content-type': 'application/json'}]
}, function (error, response, body){
if(!error & response.statusCode === 200){
for(var i=0;i<body.length;i++){
for(var j=i;j<body.length-1;j++){
//if(i === body.length-1) return;
src = body[i].name;
dest = body[j+1].name;
console.log("sorgente ",sorg);

request({
url: "https://maps.googleapis.com/maps/api/distancematrix/json?origins="+src+"&destinations="+dest,
method: "POST",
json:true,
headers:[{'content-type': 'application/json'}]
}, function (error, response, body){
if(!error & response.statusCode === 200){
console.log("TIME ",body.rows[0].elements[0].duration.text);
return;
}else{
console.log("google API failed!: ");
return;
}
});

}
}

}else{
console.log("/google_api failed!: ");
return;
}
});

我希望我对这个问题很清楚。

最佳答案

这里的问题是 Javascript 作用域和拼写错误。

首先,您硬编码了 body[0]body[1] 的数组索引。看起来你的意思是让它们成为循环变量。

其次,用简化的伪 Javascript 概述您的范围界定问题:

var requestList = [...];

for(var i = 0; i < requestList.length; i++){
var current = requestList[i];

// make a request based on current or the data
// in current.
request(..., function(result){
// do something with the current variable
current.foo = result.bar;
});
}

所有网络请求都是异步的。曾经有一种方法可以强制它们同步运行,但在大多数主流浏览器中已被弃用。这意味着发出请求并可能得到响应,在您的实际代码之外,然后调用某种回调——在这种情况下,匿名内部函数 function(result ){...}

这意味着 for 循环在发出请求时继续执行和循环,这意味着如果请求不够快,current 将更新当请求返回时会有所不同,for 循环变量也会有所不同。


对于这种事情,我遇到的解决方案是在 for 循环中确定内部请求的函数范围。

不是直接在 for 循环中发出新请求,而是将其移出到它自己的函数中:

var requestList = [...];

for(var i = 0; i < requestList.length; i++){
var current = requestList[i];

GetMyResourceData(current);
}

function GetMyResourceData(current){
request(..., function(result){
// do something with the current variable
current.foo = result.bar;
});
}

每次调用 GetMyResourceData 函数时,都会为该函数创建一个新范围,因此当您到达回调时,该函数中的 current 变量将被保留。

所以,这就是我建议您对代码执行的操作。将 for 循环之外的第二个请求移到它自己的范围内。

关于javascript - 循环内的 Http 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37421274/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com