Javascript 数组元素不变
Javascript array element not changing
我正在学习 NodeSchool 的 learnyounode。
在这个问题中,我们提供了三个 URL 作为前三个命令行参数。我们必须收集每个 URL 提供给我们的完整内容,并将其打印到控制台 (stdout)。我们不需要打印出长度,只需要打印出字符串形式的数据;每 URL 一行。问题是我们必须按照与作为命令行参数提供给我们的 URL 相同的顺序打印它们。
这是我目前尝试的解决方案,但似乎存在问题。程序进入死循环,我不明白为什么。看起来 promiseQueue
中的 Promise
对象似乎没有根据它们对应的 response.on('end', ...)
更新自己。任何帮助将不胜感激。
var http = require('http');
// Wraps an http GET request.
// Three attributes
// - data : String
// - resolved : boolean
// - error : Error
function Promise(url) {
this.resolved = false;
this.error = null;
this.data = '';
var self = this;
http.get(url, function(response) {
response.setEncoding('utf8');
response.on('data', function(data) {
self.data += data;
});
response.on('error', function(error) {
self.error = error;
self.resolved = true;
});
response.on('end', function() {
self.resolved = true;
});
});
}
var urls = process.argv.slice(2);
var promiseQueue = urls.map(function(url) {
return new Promise(url);
});
var promise;
while (promiseQueue.length) {
if (promiseQueue[0].resolved) {
promise = promiseQueue.shift();
console.log(promise.data);
}
}
JavaScript 本质上是单线程的。即一次只能运行一个任务。当异步操作完成时,它们会在事件循环中排队一个任务,当所有其他任务完成之前执行该任务。
您的 while 循环阻塞了所有其他操作,因为它 运行 无限期地保持线程忙碌,因此没有待处理的任务可以出队。您必须使用回调和事件来解决该问题。
这就是为什么没有像您那里那么小的 Promise polyfills ;-)。
我正在学习 NodeSchool 的 learnyounode。
在这个问题中,我们提供了三个 URL 作为前三个命令行参数。我们必须收集每个 URL 提供给我们的完整内容,并将其打印到控制台 (stdout)。我们不需要打印出长度,只需要打印出字符串形式的数据;每 URL 一行。问题是我们必须按照与作为命令行参数提供给我们的 URL 相同的顺序打印它们。
这是我目前尝试的解决方案,但似乎存在问题。程序进入死循环,我不明白为什么。看起来 promiseQueue
中的 Promise
对象似乎没有根据它们对应的 response.on('end', ...)
更新自己。任何帮助将不胜感激。
var http = require('http');
// Wraps an http GET request.
// Three attributes
// - data : String
// - resolved : boolean
// - error : Error
function Promise(url) {
this.resolved = false;
this.error = null;
this.data = '';
var self = this;
http.get(url, function(response) {
response.setEncoding('utf8');
response.on('data', function(data) {
self.data += data;
});
response.on('error', function(error) {
self.error = error;
self.resolved = true;
});
response.on('end', function() {
self.resolved = true;
});
});
}
var urls = process.argv.slice(2);
var promiseQueue = urls.map(function(url) {
return new Promise(url);
});
var promise;
while (promiseQueue.length) {
if (promiseQueue[0].resolved) {
promise = promiseQueue.shift();
console.log(promise.data);
}
}
JavaScript 本质上是单线程的。即一次只能运行一个任务。当异步操作完成时,它们会在事件循环中排队一个任务,当所有其他任务完成之前执行该任务。
您的 while 循环阻塞了所有其他操作,因为它 运行 无限期地保持线程忙碌,因此没有待处理的任务可以出队。您必须使用回调和事件来解决该问题。
这就是为什么没有像您那里那么小的 Promise polyfills ;-)。