对不起,如果我写得不好,我就是法国人。
我有一系列这样的项目:
items = [
{nom: 'xxx', prenom: 'zzz', montant: 500},
{nom: 'aaa', prenom: 'bbb', montant: 1000},
{nom: 'ccc', prenom: 'ddd', montant: 1500}
];
我想对此数组的每个项目执行Parse查询,以从Parse.com上的存储数据中检索信息。我这样做了:
for(var x = 0; x < items.length; x++) {
query.equalTo("nomTiers", items[x].nom);
console.log('Loop ' + x);
query.first({
success: function (result) {
nom = result.get('nomTiers');
prenom = result.get('prenTiers');
console.log(nom + ' ' + prenom);
console.log('Entered success');
lesCollab.push({
nom: nom,
prenom: prenom
});
},
error: function (error) {
// if it fails...
}
});
}
当我在浏览器上查看日志控制台时,我看到了:
Loop 1
Loop 2
Loop 3
...
Entered success
Entered success
...
这意味着我的应用程序开始在for循环中启动代码但从未启动我的解析查询。它只在我的For循环结束后才这样做。因为我不能正确地做我想做的事情而且我不明白代码为什么会这样......
每次for for循环时如何运行查询?为什么查询是在我之后运行的?
答案 0 :(得分:0)
实际上,first
的{{1}}方法是异步的,因为它涉及HTTP调用。在处理数组的下一个元素之前,您需要等待调用ParseQuery
回调。
为此你需要利用承诺。在您的情况下,您可以创建一个循环函数,该函数在提供的回调被解析后返回promise时调用自身:
success
然后,您可以使用它来实现异步循环:
const loop = (g) => {
return new Promise((f, r) => {
return g().then(v => loop(g)).catch(f);
});
};
由于var x = 0;
loop(() => {
return new Promise((resolve, reject) => {
query.equalTo("nomTiers", items[x].nom);
query.first(this.items[x], {
success: (result) => {
nom = result.get('nomTiers');
prenom = result.get('prenTiers');
console.log(nom + ' ' + prenom);
console.log('Entered success');
this.lesCollab.push({
nom: nom,
prenom: prenom
});
x++;
if (x<this.items.length) {
resolve();
}
}
});
});
});
不符合承诺,因此需要额外包含在承诺中。
这是相应的plunkr:https://plnkr.co/edit/r4qb67N0FLoPWOPNbM5w?p=preview。我使用的ParseQuery
可以替换为fakeQueryFirst
。
异步库也可能会让您对each
函数感兴趣:
query.first