2016-03-23 10 views
1

Ich versuche, ein Array synchron iterieren mit async.each:Node.js Asynchron-Array Iteration

async.each(supplier_array, function(supplier) { 
    console.log('looking at : ' + supplier); 
    knex(host_name + '.order_item').where({ 
     supplier: supplier, 
     order_id: order_id 
    }).then(function(data) { 
     console.log(data); 
     knex(host_name + '.distributor').select() 
     .then(function(data) { 
      console.log(data); 
     }).catch(function(error) { 
      console.log('error: ' + error); 
     }); 
    }).catch(function(error) { 
     console.log('error: ' + error); 
    }); 
}); 

Mein supplier_array hat drei Elemente. Also, was passieren soll, ist die App sollte (synchron):

Für Anbieter 1/erstes arr/erstes Array-Element:

  • console.log (Lieferant)
  • console.log (ORDER_ITEM)
  • console.log (Verteiler)

für Lieferanten 2/zweites Array-Element:

  • console.log (Lieferant)
  • console.log (ORDER_ITEM)
  • console.log (Verteiler)

für Lieferant 3/drittes Feldelement:

  • console.log (Lieferant)
  • console.log (ORDER_ITEM)
  • console.log (Verteiler)

es jedoch wirkt asynchron:

  • console.log (Lieferant)
  • console.log (Lieferant)
  • console.log (Lieferant)

  • console.log (order_item)

  • console.log (order_item)
  • console.log (ORDER_ITEM)

  • console.log (Verteiler)

  • console.log (Verteiler)
  • console.log (Verteiler)

Kann mir jemand die gewünschte Hilfe erreichen Effekt des Durchlaufens durch die Schritte innerhalb von async synchron?

Vielen Dank im Voraus!

+0

Warum ist es ein Problem? – Wainage

+0

Sie müssen möglicherweise eine "Rückkehr" zu jedem Knex Versprechen machen. Das bestätigt das Async, um es wissen zu lassen, dass es ein Versprechen zu verarbeiten gibt. Probieren Sie es aus und lassen Sie mich wissen, ob es die richtige Antwort ist.Ich bin mit Knex selbst auf dieses Problem gestoßen. Außerdem können Sie das Innere "dann" in Zeile 9 um eine Ebene nach hinten verschieben, da Sie ein Versprechen zurückgeben. – Handonam

Antwort

2

Sie sollten async.eachSeries verwenden, wenn Sie sie in der seriellen Reihenfolge durchlaufen möchten. Versuchen Sie etwas wie folgt:

async.eachSeries(supplier_array, function(supplier, callback) { 
    console.log('looking at : ' + supplier); 
    knex(host_name + '.order_item').where({ 
     supplier: supplier, 
     order_id: order_id 
    }).then(function(data) { 
     console.log(data); 
     knex(host_name + '.distributor').select() 
     .then(function(data) { 
      console.log(data); 
      callback(); // Advance to next iteration here 
     }).catch(function(error) { 
      console.log('error: ' + error); 
      callback(error); // Also callback when error occurs 
     }); 
    }).catch(function(error) { 
     console.log('error: ' + error); 
     callback(error); // Also callback when error occurs 
    }); 
}); 
+0

Danke - zu bestätigen - 'Callback()' wird es sagen, um den nächsten Lieferanten zu sehen, und wenden Sie all diese Prozesse auf den nächsten Anbieter? –

+0

Es scheint so zu funktionieren. Außerdem sollten Sie auf einen häufigen Fehler achten, der in der README von async.js dokumentiert ist: https://github.com/caolan/async#synchronous-iteration-functions –