Javascript 从数组项在For循环中解析查询
对不起,如果我写得不好,我是法国人 我有一系列类似这样的项目:Javascript 从数组项在For循环中解析查询,javascript,arrays,parse-platform,angular,Javascript,Arrays,Parse Platform,Angular,对不起,如果我写得不好,我是法国人 我有一系列类似这样的项目: items = [ {nom: 'xxx', prenom: 'zzz', montant: 500}, {nom: 'aaa', prenom: 'bbb', montant: 1000}, {nom: 'ccc', prenom: 'ddd', montant: 1500} ]; 我想对这个数组的每一项进行解析查询,从Parse.com上存储的数据中检索信息。我这样做:
items = [
{nom: 'xxx', prenom: 'zzz', montant: 500},
{nom: 'aaa', prenom: 'bbb', montant: 1000},
{nom: 'ccc', prenom: 'ddd', montant: 1500}
];
我想对这个数组的每一项进行解析查询,从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...
}
});
}
这意味着我的应用程序开始启动for循环中的代码,但从不启动解析查询。它只是在我的For循环结束后才这样做。正因为如此,我不能正确地做我想做的事情,我不明白为什么代码会这样
如何在每次for循环时运行查询?为什么在my for之后运行查询?事实上,
ParseQuery
的first
方法是异步的,因为它涉及一个HTTP调用。在处理数组的下一个元素之前,需要等待调用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();
}
}
});
});
});
实际上,
ParseQuery
的first
方法是异步的,因为它涉及一个HTTP调用。在处理数组的下一个元素之前,需要等待调用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();
}
}
});
});
});
默认情况下,所有xhr请求本质上都是asyc的,您需要通过承诺/回调或可观察对象来处理。默认情况下,所有xhr请求本质上都是asyc的,您需要通过承诺/回调或可观察对象来处理。