javascript - 为什么我的异步回调函数没有按顺序返回数据请求?

标签 javascript node.js

我正在学习 Node.js 并且正在学习 Node 学校的 Learnyounode 类(class),这很棒,尽管它是一个相当大的挑战而且我有点困惑......

我遇到的问题是练习 9-杂耍异步...

我正在尝试解决问题:

“您必须收集每个 URL 提供给您的完整内容,并将其打印到控制台(stdout)。您不需要打印出长度,只需将数据作为字符串;每个 URL 一行。问题是您必须按照与作为命令行参数提供给您的 URL 相同的顺序打印它们。”

我已经尝试在一个名为“waiting”的变量中计算回调数,然后在计算到 3 个回调时调用 complete() 函数,但数据仍然总是以错误的顺序返回我不知道为什么....

var http = require('http');
var bl = require('bl');
var url = []
url[0] = process.argv[2];
url[1] = process.argv[3];
url[2] = process.argv[4];
var waiting = 0;
for(i=0; i < url.length; i++) {
        var output = [];
        http.get( url[i], function(res) {
                res.setEncoding('utf8');
                res.pipe(bl(function(err,data) {
                        output.push(data.toString());
                        waiting++;
                        if(waiting == 3) {
                            complete(output);
                        }
                 }));
        });
}

var complete = function(output) {
    for(i=0; i < output.length; i++) {
        console.log(output[i]);
    }
}

最佳答案

异步回调不保证按照 HTTP 请求的顺序发生。

您可以通过更改来维持顺序:

output.push(data.toString());

到:

output[i] = data.toString();

关于javascript - 为什么我的异步回调函数没有按顺序返回数据请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30979122/

相关文章:

javascript - 使用插件压缩 webpack 包

node.js - 除非先删除 node_modules 文件夹,否则 NPM 安装无法正常工作?

javascript - 快速电子邮件错误处理,适用于嵌套中间件

javascript - 传单仅加载一个图 block

javascript - Dojo dijit/form/TimeTextBox 下拉列表的格式设置

javascript - 如果文本输入字段是可选的,我应该如何将它的值从 javascript 传递到 php

Javascript - 通过不同的 &lt;script&gt; 标签共享变量

javascript - 客户关系管理 2011 : Global JavaScript and button in status bar

node.js - 如何使用请求将文件从 Node 发送到 Amazon S3?

javascript - 在 Express.js 中使用 PUT 方法