数组项中的For循环中的ParseQuery

时间:2016-02-22 09:53:58

标签: 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查询,以从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循环时如何运行查询?为什么查询是在我之后运行的?

1 个答案:

答案 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