2015-04-23 114 views
2

我正在通過NodeSchool的learnyounode工作。JavaScript數組元素不變

在這個問題中,我們提供了三個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); 
    } 
} 

回答

2

JavaScript本質上是單線程的。也就是說,一次只能運行一個任務。當異步操作完成時,它們將任務排入事件循環中,並在任何其他任務完成之前執行。

您所擁有的while循環阻止了所有其他操作,因爲它無限期地運行並且保持線程繁忙,所以沒有掛起的任務可以被取出。你必須使用回調和事件來解決這個問題。

這就是爲什麼沒有Promise polyfill與您在那裏一樣小的原因;-)。

+0

好的答案。正是我錯過的信息。 –