2016-05-27 17 views
0

betrachten diesen CodeNodeJS - pass globale Variable Rückruf versprechen, in Parse

for (var i = 0; i < data.length; i++){ 
    query.equalTo("objectId",data[i].id).first().then(
     function(object){ 
      object.set("username", data[i].username); 
      object.save(); 
     } 
    ); 
} 

in diesem Beispiel data[i] innerhalb der then callback ist das letzte Element des Arrays

dieses zweite Beispiel betrachten, die normalerweise in JavaScript arbeiten Welt

übernehmen wir eine API verwenden, die MongoDB verbinden und hat Funktion namens Update

for (var i = 0; i < data.length; i++){ 
    query.eq("_id",data[i].id).update(data[i].username); 
} 

eq gibt das Objekt zurück, update aktualisiert dieses Objekt und speichert es.

wird es nicht fantastisch, wenn so etwas wie dies möglich ist, ... (nicht sicher, ob es auch noch funktioniert)

for (var i = 0; i < data.length; i++){ 
    query.equalTo("objectId",data[i].id).first().then(
     function(object, data[i]){ 
      object.set("username", data.username); 
      object.save(); 
     } 
    ); 
} 

Antwort

3

Das funktioniert eigentlich nicht nur wegen der var Scoping. Sie können die Probe erhalten läuft wie gewünscht nur von:

a) let statt var

b) mit einem neuen Rahmen für die Schaffung i (das ist, was let grundsätzlich der Fall ist). (In der anonymen fn, habe ich ii statt i nur für Klarheit i funktionieren würde, auch.):

for (var i = 0; i < data.length; i++){ 
    (function(ii) { 
     query.equalTo("objectId",data[ii].id).first().then(
      function(object){ 
       object.set("username", data[ii].username); 
       object.save(); 
      } 
     ); 
    })(i) 
} 
+0

In Javascript zu verwenden Alle mit var deklarierten Variablen sind Funktionsbereiche. Dieses Problem tritt auf, weil Liniendaten [i] .Benutzername asynchron ausgeführt werden und diese Zeit sich auf den letzten (oder einen anderen) Datenindex bezieht. Um dieses Szenario zu überwinden wir Closure verwenden, wie erklärt @Tomas –

+0

@JitendraKhatri @Tomas ich denke, das wird nicht, weil in Parse arbeiten wir können nicht die Variable auf den 'dann passieren callback' ... verwendet Tomas das zweite Beispiel, die vorgeschlagen als eine Lösung, 'dann (function (Token, Daten [i] {...}' aber Anwendungen analysieren 'dann (function (Token) {...}' – Eltorrooo

+0

Ja, kann ich das Problem sehen - ich bearbeitet gerade ohne weiteres die zweite Codeschnipsel, die Sie angegeben haben - was nicht korrekt ist. Ich bearbeite die Antwort –

0

der beste Weg, um dieses Problem mit parse zu lösen, ist Rekursivität

... 

    var do = function(entries, i){ 
     if (entries[i]){ 

      let user = data[i]; 

      query.equalTo("objectId", user.id).first().then(
       function(object){ 
        object.set("username", user.username); 
        object.save(); 
       } 
      ).then(
       function(){ 
        return do(entries, i + 1); 
       } 
      ); 
     } 
    }