JavaScript数组元素不改变

我正在通过NodeSchool的learnyounode工作。

在这个问题中,我们提供了三个URL作为前三个命令行参数。 我们必须收集每个URL提供给我们的完整内容,并将其打印到控制台(stdout)。 我们不需要打印出长度,只是将数据打印成string; 每个URL一行。 问题是,我们必须按照与提供给我们的URL相同的顺序将其打印出来,作为命令行参数。

这是我目前的解决scheme尝试,但是,似乎有一个问题。 程序进入一个无限循环,我不知道为什么。 看来Promise中的Promise对象似乎并没有根据相应的response.on('end', ...)来更新自己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本质上是单线程的。 也就是说,一次只能运行一个任务。 当asynchronous操作完成时,它们将事件循环中的任务排队,当所有其他任务完成之前执行该任务。

你所拥有的while循环阻塞了所有其他的操作,因为它无限期地运行,并保持线程繁忙,所以没有挂起的任务可以出队。 你必须使用callback和事件来解决这个问题。

这就是为什么没有Promise polyfill与你在那里一样小的原因;-)。