javascript - Node.js 多个异步函数

标签 javascript node.js asynchronous

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;
    }
}

我将使用三个 URL 作为前三个命令行参数。我的工作是从每个 URL 收集数据作为字符串,并按照它们在命令行中出现的顺序将它们打印到控制台。现在代码不会打印任何内容,并且陷入无限循环。怎么了?

最佳答案

代码中有两个问题。首先,循环变量上有一个闭包,这使得值与您预期的不同,如 guvinder372 所解释的那样。另请参阅this answer其中讨论了该问题和 this answer这演示了使用 Function.bind 解决问题的更好方法。

第二个问题是最后设置 while 循环的方式。该循环将连续运行,并且绝不允许 http.get 中的回调函数运行。相反,检查回调是否有其他响应进入,一旦所有三个响应都进入,就打印输出。

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]);
           });
   });
}

关于javascript - Node.js 多个异步函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37065258/

相关文章:

javascript - 选择复选框上的元素选择

javascript - 无法使用jquery获取xml元素文本值

javascript - 在 Node 服务器上使用 pdf.js

node.js - docker compose 运行时出现命令错误

javascript - 如何使用单个按钮单击来更改占位符并在同一按钮单击事件上捕获新数据

javascript - 解析错误: Unexpected token selectWinner in Firebase cloud function - Node. js V10

node.js - npm 未安装任何模块

javascript - 保留 $http.get 异步结果处理的变量值

c# - await 运算符没有像我预期的那样等待

javascript - 如何记录、创建脚本然后立即使用它