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的,您需要通过承诺/回调或可观察对象来处理。