2016-07-06 12 views
0

Ich benutze async.js zum ersten Mal und fühle mich, als würde ich etwas völlig vermissen, als ich durch brutale Gewalt in einen Arbeitszustand kam und ich bin nicht zuversichtlich, dass es mit anderen funktionieren wird Datenmenge. Ich würde gerne wissen, ob es etwas gibt, was ich hier nicht sehe.Verkettung forEachOf in async.js

Ich habe ein Array von Objekten, von denen jedes ein Array enthält. Ich möchte das Subarray durchlaufen, es in einem Aufruf für Mongo verwenden und etwas mit den Ergebnissen tun, nachdem alle zurückgegeben wurden. Die Daten sieht wie folgt aus:

Daten

productVersions: [ 
    versionA: { 
     relevantField: [ 
      { 
       relevantId: value 
      }, 
      { 
       relevantId: value 
      } 
     ] 
    }, 
    versionB: { 
     relevantField: [ 
      { 
       relevantId: value 
      }, 
      { 
       relevantId: value 
      }, 
      { 
       relevantId: value 
      } 
     ] 
    } 
]; 

Im Code ich einen Anruf für jedes Objekt in relevantField in productVersions machen wollen und nach alle Anrufe für beide Versionen ein paar Sachen zu tun gemacht wurden mit die Ergebnisse. Der Code sieht wie folgt aus:

-Code

async.forEachOf(productVersions, function(version, versionIndex, versionCallback){ 
    async.forEachOf(relevantField, function(object, objectIndex, objectCallback){ 
     Users.findById(object.relevantId, function(err, model){ 
      // get some information from mongo 
      objectCallback(); 
     }); 
    }, function(){ 
     versionCallback(); 
    }); 
}, function(err){ 
    // Do something with all the results 
}); 

Dies geschieht jetzt funktionsfähig zu sein, aber ich habe das Gefühl, dass wegen Timing und Glück ist, und wenn die Anrufe waren langsamer von, wenn mehr Daten waren es würde nicht funktionieren. Mache ich hier etwas falsch? Gibt es einen besseren Ansatz?

Antwort

0

Als async Betreuer sieht mir gut, obwohl meine persönliche Präferenz würde mich diese Funktionen trennen. Sie können auch die Verwendung von Wasserfall/Serie zur Verwaltung dieses Flusses in Betracht ziehen.

function processRelevantField(object, objectIndex, objectCallback){ 
    Users.findById(object.relevantId, function(err, model){ 
     // get some information from mongo 
     objectCallback(); 
    }); 
} 

function processVersion(version, versionIndex, versionCallback){ 
    async.forEachOf(relevantField, processRelevantField, function(){ 
     versionCallback(); 
    }); 
} 

async.forEachOf(productVersions, processVersion, function(err){ 
    // Do something with all the results 
});