Javascript node.js多个异步函数 var http=require('http'); var res=[“”,“”,“”]; 对于(i=2;i
问题是-调用回调处理程序时,i的值已经达到5,并且对于所有回调处理程序执行,它将保持5 您需要重构代码以将i的值传递给调用方法Javascript node.js多个异步函数 var http=require('http'); var res=[“”,“”,“”]; 对于(i=2;i,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,问题是-调用回调处理程序时,i的值已经达到5,并且对于所有回调处理程序执行,它将保持5 您需要重构代码以将i的值传递给调用方法 var http = require('http'); var res = ["","",""]; for(i =2;i<5;i++){ http.get(process.argv[i],function(response){ response.setEncoding('utf8'); str = "";
var http = require('http');
var res = ["","",""];
for(i =2;i<5;i++){
http.get(process.argv[i],function(response){
response.setEncoding('utf8');
str = "";
count =i-2;
response.on("data", function(data) {
str = str.concat(data);
});
response.on("end", function() {
res[count] = str;
console.log(count);
console.log(res[count]);
});
});
}
while(true) {
if(res[0]!==""&&res[1]!==""&&res[2]!=="")
{
console.log(res[0]);
console.log(res[1]);
console.log(res[2]);
break;
}
}
var http=require('http');
var res=[“”,“”,“”];
对于(i=2;i您不能在一个for…循环中执行多个http请求而不等待响应。
要以现代的方式编写此代码,您需要一些新的构造/模式,如Promise
。然后您可以等待每个响应,收集响应,然后退出调用方。
举个例子,看看我的javascript客户端解决方案。这在Node.js
中也可以用,您只需在block函数ExecutionBlock
中更改请求的方式即可
假设我们有一个要发送到某些URL的参数数组和/或不同URL的数组,那么我们将使用Promise.all
构造运行
在下面的代码段中尝试一下
要了解如何将此解决方案应用于Node.js
,请参阅我的http
get and post实现,并在本文后面的文章中查看异步任务节点中更复杂的执行
var控制台={
日志:函数{
document.getElementById(“控制台”).innerHTML+=s+“
”
}
}
//简单XMLHttpRequest
//基于https://davidwalsh.name/xmlhttprequest
SimpleRequest={
调用:函数(什么,响应){
var请求;
如果(window.XMLHttpRequest){//Mozilla,Safari。。。
请求=新的XMLHttpRequest();
}如果(window.ActiveXObject){//IE
试一试{
请求=新的ActiveXObject('Msxml2.XMLHTTP');
}捕获(e){
试一试{
请求=新的ActiveXObject('Microsoft.XMLHTTP');
}捕获(e){}
}
}
//状态变化
request.onreadystatechange=函数(){
如果(request.readyState==4){//done
如果(request.status==200){//完成
响应(request.responseText)
}else响应();
}
}
请求。打开('GET',what,true);
请求发送(空);
}
}
//允诺者
var promiseAll=功能(项目、块){
var self=这个;
var承诺=[],
指数=0;
items.forEach(功能(项目){
承诺.推送(功能(项目一){
返回新承诺(功能(解决、拒绝){
如果(块){
块。应用(此[项目、索引、解决、拒绝]);
}
});
}(项目(++索引))
});
回报承诺。全部(承诺)
};//允诺者
//延迟执行块
var ExecutionBlock=函数(项、索引、解析、拒绝){
SimpleRequest.call('https://icanhazip.com/,函数(结果){
如果(结果){
console.log(“响应[”+索引+“]”+结果);
决心(结果);
}否则{
拒绝(新错误(“呼叫错误”));
}
})
}
arr=[1,2,3]
承诺(arr,(项目、索引、解决、拒绝)=>{
log(“发出请求[“+索引+”]))
ExecutionBlock(项目、索引、解决、拒绝);
})
.then((结果)=>{console.log(结果)})
.catch((错误)=>{console.error(错误)});
代码中有两个问题。首先,循环变量上有一个闭包,它使值与guvinder372解释的预期值不同。另请参阅其中讨论了问题,并演示了使用函数.bind解决问题的更好方法
第二个问题是在最后设置while
循环的方式。该循环将持续运行,并且永远不允许http.get
中的回调函数运行。相反,如果其他响应已进入,请检查回调,并在所有三个响应进入后打印输出
var http = require('http');
var res = ["","",""];
for(i =2;i<5;i++)
{
callBackDefiner(i)
}
function callBackDefiner( i )
{
http.get(process.argv[i],function(response){
response.setEncoding('utf8');
str = "";
count =i-2;
response.on("data", function(data) {
str = str.concat(data);
});
response.on("end", function() {
res[count] = str;
console.log(count);
console.log(res[count]);
});
});
}
(i=2;i)的
for(i =2;i<5;i++){
http.get(process.argv[i],function(response){
response.setEncoding('utf8');
str = "";
count =i-2;
response.on("data", function(data) {
str = str.concat(data);
});
response.on("end", function() {
//Check here if responses are in
if(res[0]!==""&&res[1]!==""&&res[2]!=="") {
}
res[count] = str;
console.log(count);
console.log(res[count]);
});
});
}