NodeJS:在Q中循环使用Promise

我有一个循环中的承诺问题。 整个承诺对我来说是全新的,所以我试着用非常简单的例子来学习它。

在我的例子中,我有一个服务器上的2个文本文件,我想将文本文件的内容保存到一个数组中。

它使用setTimeout,但这不是我想要的解决scheme。 这里是setTimeout的例子

var http = require('http'), Q = require('q'); var urls = ["http://localhost:8000/1.txt", "http://localhost:8000/2.txt"] var txts = []; function getData(url) { http.get(url, function(res) { var data = ""; res.on('data',function(chunk){ data+=chunk; }); res.on('end',function(){ txts.push(data); }); }).on('error',function(e){ console.log("Error Request: "+e.message); }) } function getTxts() { for(a in urls) { var url = urls[a]; getData(url); } // is not working console.log(txts); // is working setTimeout(function() { console.log(txts); }, 1000) } getTxts(); 

我现在试着用Q做这个,但是我被卡住了。 有一点我正走向错误的方向,但我看不到它在哪里。

 var http = require('http'), Q = require('q'); var urls = ["http://localhost:8000/1.txt", "http://localhost:8000/2.txt"] var txts = []; function getData(url) { return Q.promise(function(respond,reject){ http.get(url, function(res) { var data = ""; res.on('data',function(chunk){ data+=chunk; }); res.on('end',function(){ txts.push(data); }); }).on('error',function(e){ console.log("Error Request: "+e.message); }) }); } function getTxts() { var promises = []; for(a in urls) { var url = urls[a]; var promise = getData(url); promises.push(promise); } return promises; } function start() { Q.fcall(function() { getTxts(); }).then(function() { console.log(txts); }) } start(); 

谢谢你的帮助!

你可以使用这个定期的承诺

 var http = require('http'); var urls = ["http://localhost:8000/1.txt", "http://localhost:8000/2.txt"] function getData(url) { return new Promise(function(resolve, reject) { http.get(url, function(res) { var data = ""; res.on('data',function(chunk){ data+=chunk; }); res.on('end',function(){ resolve(data); }); }).on('error',function(err){ reject(err); }); }); } function getTxts() { return Promise.all( urls.map(function(url) { return getData(url); }) ); } getTxts().then(function(texts) { // "texts" is an array of the returned data }).catch(function(err) { // epic fail }); 

问题是你没有解决或拒绝你在getData函数中创build的承诺

 function getData(url) { return Q.promise(function(resolve,reject){ http.get(url, function(res) { var data = ""; res.on('data',function(chunk){ data+=chunk; }); res.on('end',function(){ txts.push(data); resolve(); // resolve the promise when done }); }).on('error',function(e){ console.log("Error Request: "+e.message); reject(); // reject the promise if there is an error }) 

}); }