Node.js Q.all()和promises数组

时间:2017-01-30 22:05:55

标签: javascript arrays node.js firebase

在node.js中,我有一个Promises数组但是当我想执行Q.all()时then();过程,似乎没有任何事情发生。也许在我的阵列中有一个未解决的承诺,它阻止了这个过程?我不确定我在这里做了什么,但我的目标是一次执行所有这些功能,然后回到我的全部"令牌"数组将其发送到另一个文件。
如何正确使用Q.all()?

var pipo = new Array();
var ref_accounts = firebase.database().ref('accounts');
geoQuery.on("key_entered", function(lakey, location, distance) {
    pipo[lakey] = lakey;
});
// I have here my pipo Array full of data
var promises = [];
var token = [];
for (var key in pipo) {
    var deferred = Q.defer();
    var ref = firebase.database().ref("etablissements").orderByKey().equalTo(value).on("child_added", function(snapshot) {
        var data = snapshot.val();
        if ((data.alerte != false) && (data.categorie === categories)) {
            var ref2 = firebase.database().ref("accounts").orderByKey().equalTo(value).on("child_added", function(snapshot2) {
                var data2 = snapshot2.val();
                if (data2.token != null) {
                    token.push(data2.token);
                    deferred.resolve(data2);
                } else {
                    deferred.reject();
                    // or deferred.resolve(); ??
                }
            });
        } else {
            deferred.reject();
            // or deferred.resolve(); ??
        }
    });
    promises.push(deferred.promise);
}

我有我的承诺"数组已满和现在 我想在这里执行all in THEN,然后将所有的TOKEN捕获到数组中

     Q.all(promises).then(function(results) {
       var uniqueNames = [];
       for (i = 0; i < token.length; i++) {
           if (uniqueNames.indexOf(token[i]) === -1) {
               uniqueNames.push(token[i]);
               console.log('tokens' + token[i]);
           }
       },
       // error
       function(response) {
           console.log('Error in then' + response);
       }).catch(function(error) {
       console.log('CATCH ERROR' + error);
   });
   // Send token array to the API
   });

我真的不明白这个过程。你能解释一下这段代码有什么问题吗?

1 个答案:

答案 0 :(得分:1)

我成功了:

var pipo = new Array();

被替换为

var pipo = [];

然后我使用&#34; async&#34;并使用地图代替&#34; forEach&#34;

async.map(pipo, function (item,callback)
{ 
    ...
}); 

就像@Kato所说,这个错误是我的承诺之一被拒绝。我用它调试了它:

let count = 0;
promises.forEach(() => console.log(++count, 'done'));

最后,我将 Q.all()方法与 .then()和最重要的 .catch()一起使用!再次感谢各位帮助我解决这个问题。