Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript node.js多个异步函数 var http=require('http'); var res=[“”,“”,“”]; 对于(i=2;i_Javascript_Node.js_Asynchronous - Fatal编程技术网

Javascript node.js多个异步函数 var http=require('http'); var res=[“”,“”,“”]; 对于(i=2;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 = "";

问题是-调用回调处理程序时,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 = "";
           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]);
           });
   });
}