2015-08-31 5 views
1

Итак, я просматриваю массив с именем candidates и выполняю определенные задачи, используя каждый элемент массива, а затем в конце нажимаю результаты на Firebase candfb. Вот код:Async Parallel duplicate entries

var candidates = json.stageCandidates.candidate; 
    var list = []; 
    for (var i = 0; i < 20; i++) { 
     var candidate = []; 
     var id = candidates[i].candidateId; 
     async.parallel([ 
      function(callback) { 
       votesmart.getDetailedBio(id, function(err, json) { 
        if (!err && json.bio != undefined) 
         candidate.bio = json.bio; 
        callback(); 
       }); 
      }, 
      function(callback) { 
       votesmart.getAddress(id, function(err, json) { 
        if (!err && json.address != undefined) 
         candidate.address = json.address.office[0]; 
        callback(); 
       }); 
      }, 
      function(callback) { 
       votesmart.getRating(id, function(err, json) { 
        if (!err && json.candidateRating != undefined) 
         candidate.ratings = json.candidateRating; 
        callback(); 
       }); 
      }, 
      function(callback) { 
       votesmart.getVotes(id, function(err, json) { 
        if (!err && json.bills != undefined) 
         candidate.votes = json.bills; 
        callback(); 
       }) 
      }, 
      function(callback) { 
       votesmart.getStances(id, function(err, json) { 
        if (!err && json.npat != undefined) 
         candidate.stances = json.npat; 
        callback(); 
       }) 
      } 
     ], function() { 
      candfb.push(candidate); 
      // res.send(candidate); 
     }) 
    }; 

Теперь проблема заключается в том, что даже если есть ровно 20 пункты толкают (жестко вписан в петле) есть дубликаты некоторых пунктов и некоторые из них пропуска. Некоторые предметы могут быть уникальными, в то время как другие могут иметь до 3 копий, которые будут помещены в Firebase. Я также проверил, и массив candidates не имеет дубликатов.

Я подозреваю, что это может быть связано с использованием async.parallel(), но я не уверен, что сменить, чтобы заставить его работать.

ответ

3

Попробуйте это, оно должно исправить вашу проблему. Это обычная ошибка при смешивании синхронных циклов с асинхронными вызовами. Вам нужно закрыть i, иначе он будет мутирован.

var candidates = json.stageCandidates.candidate; 
    var list = []; 
    for (var i = 0; i < 20; i++) { 
     (function(i){ 
      var candidate = []; 
      var id = candidates[i].candidateId; 
      async.parallel([ 
       function(callback) { 
        votesmart.getDetailedBio(id, function(err, json) { 
         if (!err && json.bio != undefined) 
          candidate.bio = json.bio; 
         callback(); 
        }); 
       }, 
       function(callback) { 
        votesmart.getAddress(id, function(err, json) { 
         if (!err && json.address != undefined) 
          candidate.address = json.address.office[0]; 
         callback(); 
        }); 
       }, 
       function(callback) { 
        votesmart.getRating(id, function(err, json) { 
         if (!err && json.candidateRating != undefined) 
          candidate.ratings = json.candidateRating; 
         callback(); 
        }); 
       }, 
       function(callback) { 
        votesmart.getVotes(id, function(err, json) { 
         if (!err && json.bills != undefined) 
          candidate.votes = json.bills; 
         callback(); 
        }) 
       }, 
       function(callback) { 
        votesmart.getStances(id, function(err, json) { 
         if (!err && json.npat != undefined) 
          candidate.stances = json.npat; 
         callback(); 
        }) 
       } 
      ], function() { 
       candfb.push(candidate); 
       // res.send(candidate); 
      }) 
     })(i) 
    }; 
+0

Большое вам спасибо! –