2017-01-09 2 views
0

Async.series wird gesagt, die Funktion der Reihe nach ausgeführt werden, aber es funktioniert nicht für mich,Wie genau führt async.series seine Funktionen aus?

Mein Code:

var mysql=require('mysql'); 
var async=require('async'); 
var con; 
var EID=30; 
var res; 
async.series([ 
    function(callback) { 
     console.log("inside first func"); 
     con = mysql.createConnection({ 
     host: 'localhost', 
     user: 'root', 
     password: '', 
     database: 'imd2' 
     }); 
     callback(); 
    }, 
    function(callback) { 
     console.log("inside second function"); 
     var sql = "select EName from users where EID=" + EID; 
     con.query(sql, function(err, rows) { 
     console.log("inside query"); 
     res = rows; 
     }); 
     callback(); 
    } 
    ], 
    function(err) { 
    console.log("third function"); 
    if (err) 
     return next(err); 
    console.log(res); 
    }); 
console.log("hi"); 

und meine Ausgabe

inside first func 
inside second function 
third function 
undefined 
hi 
inside query 

ist, wenn ich die zweite ändern Funktionsrückruf innerhalb der con.query() Dann ändert sich der Ausgang zu

inside first func 
inside second function 
hi 
inside query 
third function 
[ RowDataPacket { EName: 'AndhraPradesh' } ] 

Meine erwartete Ausgabe ist

inside first func 
inside second function 
inside query 
third function 
[ RowDataPacket { EName: 'AndhraPradesh' } ] 
hi 

korrigiert mich wenn ich falsch bin, aber die Funktion (err) sollte im letzten genannt werden, und dann „hallo“ sollte richtig angezeigt werden? (Von den Definitionen) Was soll ich tun, um meine erwartete Ausgabe zu erhalten?

PS „hallo“ ist nur ein Debug, wird es sehr wichtig, Codes nach async.series durchgeführt werden, und es wird nicht am besten passen in eine neue Funktion innerhalb async.series Dank

+0

console.log ("hi"); ist außerhalb async.series Aufruf, mit async-Serie verwalten Sie die Reihenfolge der internen, wenn Sie Reihenfolge in den folgenden Funktionen fordern müssen Sie diese in async.series –

+0

Ok, Sie ignorierten die PS enthalten. part, Die Sache ist, console.log ("hi") wird durch eine Reihe von Funktionen und Anweisungen ersetzt, die standardmäßig synchron sind und keine zusätzliche Änderung benötigen, wenn ich alle Funktionen innerhalb von async nur für die zweite Funktion integrieren muss Ich glaube, das wird ein schlechtes Qualitätsprogramm sein. Der Kern dieser Frage ist die sectond-Funktion. Ich glaube, es könnte eine andere Problemumgehung geben, wenn man die mysql-Abfragesyntax synchron macht. –

Antwort

0

function(err) hier ist einfach der Rückruf der Async-Serie. Alles, was Sie tun möchten nach die Serie muss hier erfolgen. Moving console.log("hi") in dieser Funktion sollte helfen.

function(err) { 
    console.log("third function"); 
    if (err) 
     return next(err); 
    console.log(res); 
    console.log("hi"); 
}); 

Der zweite Punkt ist, in einer Reihe async, dass callback() einfach die nächste Funktion aufruft. Jetzt ist die Sache, dass Sie eine andere asynchrone Methode innerhalb der zweiten Funktion der Reihe verwenden.

function(callback) { 
    con.query(sql, function(err, rows) { 
     console.log("inside query"); 
     res = rows; 
    }); 
    callback(); 
} 

con.query ist eine Asynchron-Aufgabe mit einer Callback-Funktion. Async bedeutet, dass Sie nicht wissen, wann der Callback verarbeitet wird. Sie muß also callback() innerhalb des Rückrufs von con.query wie so nennen:

function(callback) { 
    con.query(sql, function(err, rows) { 
     console.log("inside query"); 
     res = rows; 
     callback(); 
    }); 
} 

diese Weise wird die nächste Funktion wird nur ausgelöst werden, wenn Sie das Ergebnis aus der Abfrage erhalten haben (und protokolliert „inside-Abfrage“).

+0

Wieder ignorierst du den PS-Teil, console.log ("hi") ist eigentlich eine Reihe von größeren Anweisungen, die idealerweise außerhalb der async.series-Funktion und idealerweise nach async.series ausgeführt werden sollten, und ich habe die Callback-Funktion beibehalten innerhalb von con.query() und zeigte auch das Ergebnis in der Frage (zweiter Ausgabecode) –

+0

@VishwanthIronHeart Sie können eine Funktion außerhalb der Serie mit dem Code erstellen, den Sie nach der Serie ausführen möchten. Dann rufe in dieser 'Funktion (err)' einfach diese Funktion auf. Der Code, den Sie zeigten, hatte die Callback-Funktion außerhalb der 'con.Frage, so dass ich vermutete, dass Sie nicht sicher waren, es zu sagen. Ich wollte das nur klären. –

+0

ist es trotzdem möglich, Sie persönlich zu kontaktieren? Ich bin mir sicher, auch wenn dieses Problem gelöst wird, gibt es noch zwei Forking voraus, und ich habe es schwer, die Dokumentation für nodejs zu lesen ... Auch in Bezug auf Ihren Kommentar, http://StackOverflow.com/ questions/41521097/alexa-and-mysql-remote-endpoint-kann nicht aufgerufen werden oder hat-invalid-input. Verweisen Sie diese Frage von mir, Sie werden verstehen, warum der Aufruf einer Funktion vom Rückruf der Funktion (err) nicht wieder am besten wäre. Da das Snippet in dieser Frage bereits in einer Funktion enthalten ist. –