Javascript数组元素未更改

时间:2015-04-23 08:00:09

标签: javascript arrays node.js asynchronous

我正在通过NodeSchool的learnyounode工作。

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

以下是我目前尝试解决的问题,但似乎存在问题。程序进入无限循环,我无法弄清楚原因。看来Promise中的promiseQueue个对象似乎没有根据相应的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);
  }
}

1 个答案:

答案 0 :(得分:2)

JavaScript本质上是单线程的。也就是说,一次只能运行一个任务。异步操作完成后,它们会在事件循环中对任务进行排队,该任务在完成所有其他任务之前执行。

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

这就是为什么没有像你那里那样小的Promise polyfill; - )。