javascript - http 请求方法中的回调 - 未按正确顺序发生

标签 javascript node.js

我编写了一个程序,它为三个不同的 URL 发出 HTTP GET 请求。该程序应该按照提供 URL 的顺序输出消息正文,但它并没有这样做,即使我正在按照这个顺序进行回调。

最终程序应该要求用户通过命令行输入 URL,但为了便于测试,我只是简单地分配了变量。

我意识到这段代码可以更加面向对象——但是我是 JavaScript 的新手,目前我的重点不是学习如何实现

var http = require('http')

// var url_1 = process.argv[2]
// var url_2 = process.argv[3]
// var url_3 = process.argv[4]

var url_1 = 'http://youvegotmail.warnerbros.com/cmp/0frameset.html'
var url_2 = 'http://www.3riversstadium.com/index2.html'
var url_3 = 'http://toastytech.com/evil/'

var output_1 = ''
var output_2 = ''
var output_3 = ''


function getHttp_1 (callback) {
    http.get(url_1, function getResponse (response1) {
        response1.setEncoding('utf8')
        response1.on('data', function (data) {
            output_1 = output_1 + data
        })
        response1.on('end', function processData() {
            console.log("Printing Result 1:")
            callback(output_1)
        })
    })
}

function getHttp_2 (callback) {
    http.get(url_2, function getResponse (response2) {
        response2.setEncoding('utf8')
        response2.on('data', function (data) {
            output_2 = output_2 + data
        })
        response2.on('end', function processData() {
            console.log("Printing Result 2:")
            callback(output_2)
        })
    })
}

function getHttp_3 (callback) {
    http.get(url_3, function getResponse (response3) {
        response3.setEncoding('utf8')
        response3.on('data', function (data) {
            output_3 = output_3 + data
        })
        response3.on('end', function processData() {
            console.log("Printing Result 3:")
            callback(output_3)
        })
    })
}

function printResults(output) {
    console.log("Result")
    // console.log(output)
}

getHttp_1(printResults)
getHttp_2(printResults)
getHttp_3(printResults)

编辑:

我通常得到的结果:

Printing Result 3:
Result
Printing Result 2:
Result
Printing Result 1:
Result

我期望的结果:

Printing Result 1:
Result
Printing Result 2:
Result
Printing Result 3:
Result

最佳答案

与某些答案提出的顺序回调方法相反,使用 Promise s 将使这更高效(请求将并行进行)和更简单:

var http = require('http'),
    urls = [
        'http://youvegotmail.warnerbros.com/cmp/0frameset.html',
        'http://www.3riversstadium.com/index2.html',
        'http://toastytech.com/evil/'
    ];

Promise.all(urls.map(getUrl))
       .then(function (results) {
            results.forEach(function (output, i) {
                console.log("Result #" + (i + 1) +
                            " with length: " + output.length);
            });
       });

function getUrl(url, i) {
    return new Promise(function (resolve, reject) {
        http.get(url, function getResponse(resp) {
            var output = '';
            resp.setEncoding('utf8');
            resp.on('data', function (data) {
                output += data;
            });
            resp.on('end', function processData() {
                console.log("Resolving Result " + (i + 1) + ":");
                resolve(output);
            });
        })
    });
}

关于javascript - http 请求方法中的回调 - 未按正确顺序发生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38340884/

相关文章:

javascript - 如何使用 HTML/CSS/JS 为指示耗时的半圆形仪表制作动画?

javascript - 仅当数组长度达到 X 个元素时执行

node.js - 可以使用 Node.js 构建 FormFlow 对话框吗?

javascript - Webpack 找不到 webpack.config.js

javascript - 一个 div 中的 X 个部分

node.js - Rethinkdb Node 将 feed 更改为 HTML

node.js - 如何在 localhost 中通过 node.js 使用 webodf 编辑器

javascript - 在 CONNECT 平台上以编程方式调用内部 Node

javascript - 使用 Google App Engine Flask dev_appserver.py 运行本地开发时,Chrome 不会刷新静态 JS 文件

javascript - 找不到 sharejs 对象的方法 'attach'