javascript - Node.js Q.all() 和 Promise 数组

标签 javascript arrays node.js firebase

在node.js中,我有一个Promises数组,但是当我想执行Q.all().then();时过程中,似乎什么也没有发生。也许我的数组中有一个 Unresolved promise 并且它阻止了进程?我不太确定我在这里做什么,但我的目标是一次性执行所有这些函数,然后取回完整的“ token ”数组以将其发送到另一个文件中。
我该怎么办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);
}

我的“ promise ”数组已满,现在 我想在这里一次性执行所有内容,然后获取数组中捕获的所有 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
   });

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

最佳答案

我成功了:

var pipo = new Array();

已替换为

var pipo = [];

然后我使用“async”并使用 map 而不是“forEach”

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

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

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

最后,我使用了Q.all()方法和.then()以及最重要的.catch()!再次感谢你们帮我解决这个问题。

关于javascript - Node.js Q.all() 和 Promise 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41946239/

相关文章:

javascript - 禁用输入文本访问但保持元素启用

javascript - 双双括号javascript

c - 一月提醒程序中的strcmp()函数理解

arrays - 在各行上打印相同的 IP 地址子网

javascript - 使用express angularJs和mongoDB,但 Angular 中的ngResource未加载

javascript - 将数据导入 Mongodb 模式

php - 多个记录连接在一个查询字符串中

c# - 我可以在 javascript 中使用 resolveurl

php - 我不知道如何使用 "sort"数组

node.js - 编译后从 typescript 命名空间导出类给出未定义(NestJS)