我编写了一个程序,它为三个不同的 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/