2016-07-06 2 views
0

Использование async.js в первый раз и ощущение, что я просто полностью что-то упустил, когда я добрался до рабочего состояния с помощью грубой силы, и я не уверен, что он будет работать с любым другим набор данных. Хотелось бы узнать, есть ли что-то, чего я не вижу здесь.Цепочка для EachOf в async.js

У меня есть массив объектов, каждый из которых содержит массив. Я хочу выполнить итерацию через подмассиву, использовать ее в вызове mongo и сделать что-то с результатами после их возвращения. Данные выглядит следующим образом:

данных

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

В коде я хочу сделать вызов для каждого объекта в relevantField в productVersions и после того, как все звонки были сделаны для обеих версий делать некоторые вещи с результаты. Код выглядит следующим образом:

Код

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 
}); 

Это происходит, чтобы быть функциональным прямо сейчас, но у меня есть ощущение, что это из-за времени и удачи, и если звонки были медленнее из если бы было больше данных это не сработает. Я делаю что-то неправильно здесь? Есть ли лучший подход?

ответ

0

Как поддерживающий async, мне все равно, хотя мои личные предпочтения заставили бы меня разделить эти функции. Вы также можете рассмотреть возможность использования водопада/серии для управления этим потоком

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 
}); 

 Смежные вопросы

  • Нет связанных вопросов^_^