【发布时间】: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