【问题标题】:Node.js Q.all() and array of promisesNode.js Q.all() 和承诺数组
【发布时间】:2017-01-30 22:05:55
【问题描述】:

在 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);
}

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

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

【问题讨论】:

  • 您的问题可能与for循环有关。尝试将for (var key in pipo) 的功能块的内容提取到一个单独的函数中,看看是否有帮助。 (谷歌不会在循环 javascript 中创建函数)。我建议在这里改用array.map()
  • 您首先要添加一个 .catch() 块来捕获输出的任何错误。您还应该在调用 Q.all() 方法之前(以确保代码实际在此处生成)和在 .then() 内部(这样您就知道它是否真正解决了)另外记录。作为最后的手段,你会想做 let count = 0; promises.forEach(() => console.log(++count, 'done'));
  • (基本调试尽职调查;检查所有输出并隔离故障点)
  • 谢谢@Kato。我用 .catch() 块编辑了我的问题,我按照你说的做了!我检查了所有输出,一切都很好,但我记录了“当时出错”。所以现在,我可以看到问题出在哪里了。我该如何解决这个问题?
  • 这意味着你的一个承诺是调用 reject() 但没有传递任何细节。所以你需要像我上面提到的那样 foreach 承诺并找出哪个承诺,然后在那里挖掘。

标签: javascript arrays node.js firebase


【解决方案1】:

我成功了:

var pipo = new Array();


取代
var pipo = [];

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2016-03-04
    • 1970-01-01
    • 2014-02-02
    • 1970-01-01
    • 1970-01-01
    • 2014-08-30
    • 2018-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多