2016-06-24 17 views
-1

Ich möchte diese drei schreiben für Schleifen mit Versprechungen etwas wie:Für Schleifen mit dem Versprechen

for i = 1 .. 3 
for j = 1 .. 5 
    for k = 1 .. 6 
    post call to db to check if there is item on location i, j, k 
  • Schritt 1: überprüfen 1,1,1
  • Schritt 2: überprüfen 1,1,2 Artikel gefunden werden oder inc nächsten Index
  • ...

ich für ähnliche Fragen gesucht, aber ich bekomme nur eindimensionale Array Beispiele Schleife.

Ich fand dieses sehr harte Problem und ich hoffe, Sie können mir helfen. Vielen Dank.

+2

ist nicht nur das so vage, es kann nicht vernünftig beantwortet werden, es ist auch fehlgeleitet. Versprechen sind async, für Schleifen nicht. Sie können nicht einfach auf ein Versprechen warten, um es zu lösen. – Claies

+0

Bitte machen Sie ein [minimales, vollständiges und überprüfbares Beispiel] (http://stackoverflow.com/help/mcve). – user3078414

+0

@Claise: Ja, ich habe hier falsche Worte benutzt, sry. jfriend00 erklärt in den Antworten unten, was mein Problem ist :) – El53

Antwort

0

Verrohrung verspricht, kann linear erfolgen. Also in Ihrem Fall, müssen Sie zunächst ein Array erzeugen, die alle möglichen combinaisons hält etwa so:

$locations = [ 
    [1, 1, 1], [1, 1, 2], [1, 1, 3], [1, 1, 4], 
    .... 
]; 

Dann können Sie einfach Schleife über dieses Array und Rohr Ihre Versprechen. Hoffe, das hilft

0

Sie können nicht eine synchrone for-Schleife mit asynchronen Operationen kombinieren und Dinge richtig Reihenfolge, weil es keine Möglichkeit gibt, eine for Schleife "warten" auf ein Versprechen zu beenden. Die for-Schleife wird synchron ausgeführt, sodass alle asynchronen Vorgänge gleichzeitig gestartet werden.

Also, stattdessen müssen Sie Ihre Iterationen anders machen. Wenn Sie nur einen Parameter iterieren würden, gäbe es eine Reihe vorgefertigter Möglichkeiten, dies zu tun, aber mir sind keine vorgefertigten Lösungen bekannt, um drei verschachtelte Variablen zu iterieren, so dass Sie Ihre eigenen erstellen müssen. Hier ist eine Möglichkeit, es zu tun. Diese Methode ist speziell für Ihre Iterationen codiert, die es ein bisschen weniger Code macht, die ein allgemeines Schema:

// fn gets called like this fn(i, j, k) and must return a promise 
function iterateLevels(fn) { 
    var i = 1, iMax = 3; 
    var j = 1, jMax = 5; 
    var k = 1, kMax = 6; 

    function next() { 
     if (k > kMax) { 
      j++; 
      k = 1; 
     } 
     if (j > jMax) { 
      i++; 
      j = 1; 
     } 
     if (i > iMax) { 
      return; 
     } 
     return fn(i, j, k).then(function(result) { 
      k++; 
      // process result here 

      // if you want to continue processing, then 
      return next(); 
     }); 
    } 
    return next(); 
} 

Hier ist eine Arbeits Demo Implementierung ein Versprechen mit einer zufälligen Verzögerung mit: https://jsfiddle.net/jfriend00/q2Lnhszt/

Die next() Funktion mit der Die äußeren Bereichsvariablen i, j und k sind im Wesentlichen eine Zustandsmaschine, bei der jedes Mal, wenn Sie next() aufrufen, die nächste Iteration ausgeführt wird und der Status aktualisiert wird.

Dies könnte generisch gemacht werden, so dass Sie übergeben, wie viele Stufen der Iteration und was die Start-und Stop-Werte für jede Ebene sind und Sie könnten eine Funktion für die Verarbeitung des Ergebnisses übergeben. Wenn Sie es generisch machen, wird der Implementierung mehr Code hinzugefügt und die Logik wird dadurch etwas schwieriger.

+0

hinzugefügt arbeiten Demo-Implementierung. – jfriend00