在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
});
我真的不明白这个过程。你能解释一下这段代码有什么问题吗?
答案 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()一起使用!再次感谢各位帮助我解决这个问题。