sql >> Database teknologi >  >> NoSQL >> MongoDB

Håndtering af asynkrone databaseforespørgsler i node.js og mongodb

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



  1. Indsæt ordbog i MongoDB med c#-driver

  2. Spring Data:Unikt felt i MongoDB dokument

  3. MongoDB Intern implementering af indeksering?

  4. 10 spørgsmål at stille (og besvare), når du hoster MongoDB på AWS