Javascript NodeJS:在循环中与Q一起使用承诺

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

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

在我的示例中,服务器上有两个文本文件,我希望将文本文件的内容保存到数组中

它使用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函数中创建的承诺

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(){/*…*/});谢谢你的帮助!