2016-11-10 5 views
-1

Ich versuche, etwas ziemlich einfach zu tun, es scheint in NodeJS - Ich möchte Funktionen nacheinander ausführen. Alle diese Funktionen haben Rückrufe. Ich habe meinen Code unten sowie die Funktion, die sie für weitere Referenz ausführen, umrissen.Ausführen von Funktionen synchron in NodeJS (MongoDB Operationen/Async.js)

Mein Problem ist, dass die ersten beiden absolut gut funktionieren - eins nach dem anderen, aber die dritte Iteration ignoriert einfach die ersten beiden Funktionen und geht einfach trotzdem. Dies verursacht ein echtes Problem, da mein Programm mit dem Einfügen von Objekten in eine Datenbank arbeitet und doppelte Objekte verursacht.

Das allgemeine Ziel besteht darin, einfach jede Funktion einzeln ausführen zu lassen. Gibt es etwas, was mir hier fehlt? Vielen Dank für deine Hilfe!

Bitte beachten Sie, dass ich in den folgenden Funktionen alle Parameter auf "Args" vereinfacht, um das Lesen zu erleichtern.

Aufruf der Funktionen:

addNewProject(args); 
addNewProject(args); 
addNewProject(args); 

Innerhalb der Funktionen, ich laufe dies:

function addNewProject(args) { 
    var info = args; 
    queue.push(function (done) { 
     loopThroughDetails(info, projID, 0, function() { 
      console.log('complete'); 
      done(null, true); 
     }); 
    }); 
} 

Dies erfordert loopThroughDetails(), die eine Integration mit async.series arbeiten():

function loopThroughDetails(info, projID, i, callback) { 
    if (i < 500) { 
     getProjectDetails(projID + "-" + i, function (finished) { 
      if (JSON.stringify(finished) == "[]") { 
       info.ProjID = projID + "-" + i; 
       DB_COLLECTION_NAME.insert(info, function (err, result) { 
        assert.equal(err, null); 
        callback(); 
       }); 
      } else { 
       i++; 
       loopThroughDetails(info, projID, i, callback); 
      } 
     }); 

    } 
} 

Und nach dem Aufruf all dies verwende ich einfach async.series, um die Aufgabe zu erfüllen:

async.series(queue, function() { 
    console.log('all done'); 
}); 

Was mache ich hier falsch? Vielen Dank für jede Hilfe, die Sie geben können! :)

+0

Gibt es einen Grund, warum Sie die addNewProject-Methoden explizit so aufrufen? Können sie nacheinander über einen iterativen Prozess wie eine Schleife oder ... aufgerufen werden? Wie wäre es, wenn Sie nur ein oder zwei Projekte hinzufügen? –

Antwort

-1

Erstens gibt es viele Methoden, um zu erreichen, was Sie suchen und die meisten sind subjektiv. Ich verwende gerne eine array.shift-Methode, wenn ich synchron bin, wenn es möglich ist. Das Konzept geht ungefähr so.

// say you have an array of projects you need to add. 
var arrayOfProjects = [{name: "project1"}, {name: "project2"}, {name: "project3"}]; 

// This takes the first project off of the array and assigns it to "next" leaving the remaining items on the array. 

var nextProject = function (array) { 

    // if there are items left then do work. Otherwise done. 
    if (array.length > 0) { 
     // shift the item off of the array and onto "next" 
     var next = array.shift(); 

     addNewProject(next); 

    } 

} 
var addNewProject = function (project) { 
    // Do stuff with the project 
    console.log("project name: ", project.name); 
    // When complete start over 
    nextProject(arrayOfProjects); 
} 

// Start the process 
nextProject(arrayOfProjects); 

Here is a working Example

wenn Sie die Seite inspizieren Sie die Projekte auf der Konsole eingeloggt sehen.

+0

Vielen Dank für Ihre Hilfe! Diese einfache Erklärung hat gerade meine Woche gemacht !! :) Habe seit fünf Tagen damit herumgespielt. Nicht sicher, warum jemand diese vollkommen gute Antwort abgelehnt hat :( –

+0

Gern geschehen! Manche Leute sind nur narzisstisch und kümmern sich nicht um andere. Das Ziel hier ist, wann und wo Sie helfen können. Sie werden vielleicht nicht immer syntaktisch korrekt antworte aber manchmal kann ein einfaches Konzept helfen Es scheint, dass die Leute erwarten, dass du bereits ein Experte bist –

+0

Einverstanden! Ich schätze, es ist egal, dass die Leute es jetzt ablehnen, da die Antwort schon da ist :) –