Javascript数组元素不变

Posted

技术标签:

【中文标题】Javascript数组元素不变【英文标题】:Javascript array element not changing 【发布时间】:2015-07-01 06:27:52 【问题描述】:

我正在学习 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);
  

【问题讨论】:

【参考方案1】:

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

您拥有的 while 循环阻塞了所有其他操作,因为它无限期地运行并使线程保持忙碌,因此不能将待处理的任务出队。您必须使用回调和事件来解决问题。

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

【讨论】:

很好的答案。正是我丢失的信息。

以上是关于Javascript数组元素不变的主要内容,如果未能解决你的问题,请参考以下文章

js 的数组怎么push一个对象. Js数组的操作push,pop,shift,unshift JavaScrip

好程序员分享JavaScrip数组去重操作实例小结

JavaScript常用数组方法

JavaScrip和Java一样吗?

JavaScript之arguments

JavaScrip for infor offorEachmapfiltersomeevery