Før jeg forklarer yderligere, vil jeg gerne bemærke, at der er en fejl i din kode:
function(err_positive, result_positive) { result_positive.count(function(err, count){ console.log("Total matches:" + count); positives[i] =count; // <--- BUG:jeg id altid 5, fordi det }); // er fanget i en lukning
Problem med klassiske lukninger og løkker. Se:Venligst forklare brugen af JavaScript-lukninger i loops
Nu, hvordan man håndterer asynkrone funktioner i sløjfer. Den grundlæggende idé er, at du skal holde styr på, hvor mange asynkrone opkald, der har gennemført, og køre din kode, når det sidste opkald vender tilbage. For eksempel:
var END=5;var counter=end;for (var i=0;i
Men hvis vi bliver ved med at gøre dette, er det indlysende, at vi ender med at skabe en masse midlertidige variabler og ende med forfærdeligt indlejret kode. Men da dette er javascript, kan vi indkapsle logikken for dette mønster i en funktion. Her er min implementering af denne "wait-for-all-to-complete" logik i javascript:Koordinering af parallel eksekvering i node.js
Men da vi bruger node.js, kan vi bruge den praktiske async-modulformular npm:https://npmjs .org/package/async
Med async kan du skrive din kode sådan her:
var queries =[];// Opbyg queries:for (var i=0;i <5; i++) { queries.push((function(j){ return function(callback) { collection. find( {værdi:1}, {created_on:{ $gte:startTime + (j*60*1000 - 30*1000), $lt:startTime + (j*60*1000 + 30*1000) }, function( err_positive, result_positive) { result_positive.count(function(err, count){ console.log("Total matches:" + count); positives[j] =count; callback(); }); } ); } })( jeg)); queries.push((function(j){ return function(callback) { collection.find( {value:0}, {created_on:{ $gte:startTime + (j*60*1000 - 30*1000), $lt:startTime + (j*60*1000 + 30*1000) } }, function(err_negative, result_negative) { result_negative.count(function(err, count){ console.log("Total matches:" + count); negatives[j ] =optælling; tilbagekald(); }); } ); } })(i)); }// Udfør nu forespørgslerne:async.parallel(queries, function(){ // Denne funktion udføres efter alle forespørgslerne er returneret // Så vi har adgang til de afsluttede positive og negative:// Vi kan f.eks. dumpe arrays i Firebug:console.log(positive,negatives);});