Javascript NodeJS:在循环中与Q一起使用承诺
我对循环中的承诺有问题。整个承诺对我来说是全新的,所以我试着用非常简单的例子来学习它 在我的示例中,服务器上有两个文本文件,我希望将文本文件的内容保存到数组中 它使用setTimeout,但这不是我想要的解决方案。下面是设置超时的示例Javascript NodeJS:在循环中与Q一起使用承诺,javascript,node.js,promise,Javascript,Node.js,Promise,我对循环中的承诺有问题。整个承诺对我来说是全新的,所以我试着用非常简单的例子来学习它 在我的示例中,服务器上有两个文本文件,我希望将文本文件的内容保存到数组中 它使用setTimeout,但这不是我想要的解决方案。下面是设置超时的示例 var http = require('http'), Q = require('q'); var urls = ["http://localhost:8000/1.txt", "http://localhost:8000/2.txt"] var
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函数中创建的承诺
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
})
}));
}你说得对,我在监督这件事。但这不是它,Q库还需要其他东西,我的应用程序无法实现。明白了!getTxts()需要返回Q.all(promissions),start()调用getTxts(),然后(function(){/*…*/});谢谢你的帮助!