Valeur de retour non définie de l'appel de fonction Javascritpt

J'essaie d'obtenir la valeur de retour, mais toujours toujours indéfini.

var hasNext; es.search(nextQuery, function (err, data) { if(data.hits.hits.length) { return hasNext = true; } return hasNext = false; }); 

Je ne suis pas sûr de savoir comment obtenir la valeur de retour et l'utiliser ailleurs? Je dois utiliser n'importe quelle valeur de retour pour valider avec d'autres fonctions, mais cela semble être dans la portée ou quelque chose.

C'est mon code:

 functions.getRecentPost = function ( req, res, next ) { ......... // This will get all the post es.search(query, function (err, data) { if(err) { // if error means no post and redirect them to create one return res.redirect('/new/post'); } .... content.hasPrevious = hasPreviousPage(_page, content.posts.length); // this function is okay hasNextPage(_page, content.posts.length, function (data) { content.hasNext = data; }); res.render("index.html", content); }); }; function hasNextPage (pageNum, totalPost, callback) { es.search(query, function (err, data) { if(data.hits.hits.length) { return callback(true); } return callback(false); }); }; 

Déplacez la ligne suivante:

 res.render("index.html", content); 

Dans le rappel de hasNextPage :

 functions.getRecentPost = function ( req, res, next ) { //......... es.search(query, function (err, data) { //......... hasNextPage(_page, content.posts.length, function (data) { content.hasNext = data; res.render("index.html", content); }); }); }; 

Si vous prévoyez que getRecentPost renverra quelque chose, vous devrez également ajouter un rappel pour que vous puissiez utiliser sa valeur de retour. Par exemple, si vous prévoyez de le faire:

 functions.getRecentPost = function ( req, res, next) { //...... return content; } doSomething(functions.getRecentPost(x,y,z)); 

Cela ne fonctionnera pas car la valeur finale du contenu sera récupérée de manière asynchrone. Au lieu de cela, vous devez le faire:

 functions.getRecentPost = function ( req, res, next, callback ) { //......... hasNextPage(_page, content.posts.length, function (data) { content.hasNext = data; res.render("index.html", content); callback(content); }); }; functions.getRecentPost(x,y,z,function(content){ doSomething(content); }) 

Vous ne pouvez pas retourner les données de manière asynchrone. Vous devez modifier votre code (et votre façon de penser) d'écrire des choses comme ceci:

 asyncFunction(function(data){ foo = data; }); doSomething(foo); 

Dans ceci:

 asyncFunction(function(data){ doSomething(data); }); 

Fondamentalement, déplacez tout le code que vous souhaitez exécuter après la fonction async dans la fonction de rappel que vous avez transmise.

Le code imperatif régulier ressemble à ceci:

 function fN () { x = fA(); y = fB(x); z = fC(y); return fD(fE(z)); } 

Le code asynchrone ressemble à ceci:

 function fN (callback) { fA(function(x){ fB(x,function(y){ fC(y,function(z){ fE(z,function(zz){ fD(zz,function(zzz){ callback(zzz); }); }); }); }); }); } 

Notez que vous ne retournez pas, vous passez un rappel à la place.