我正在尝试获取返回值,但始终无法定义。
var hasNext; es.search(nextQuery, function (err, data) { if(data.hits.hits.length) { return hasNext = true; } return hasNext = false; });
我不确定如何获取任何返回值并在其他地方使用它?我需要使用此返回值来与其他函数进行验证,但是它似乎在范围之内。
这是我的代码:
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); }); };
移动以下行:
res.render("index.html", content);
进入hasNextPage回调:
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); }); }); };
如果希望getRecentPost返回某些内容,则还需要向其添加回调,以便可以使用它的返回值。例如,如果您希望这样做:
getRecentPost
functions.getRecentPost = function ( req, res, next) { //...... return content; } doSomething(functions.getRecentPost(x,y,z));
这将无法正常工作,因为内容的最终值将被异步检索。相反,您需要这样做:
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); })
您不能异步返回数据。您需要通过编写如下代码来更改代码(和思维):
asyncFunction(function(data){ foo = data; }); doSomething(foo);
到这个:
asyncFunction(function(data){ doSomething(data); });
基本上,将所有要在异步函数之后运行的代码移入传递给它的回调函数中。
常规命令式代码如下所示:
function fN () { x = fA(); y = fB(x); z = fC(y); return fD(fE(z)); }
异步代码如下所示:
function fN (callback) { fA(function(x){ fB(x,function(y){ fC(y,function(z){ fE(z,function(zz){ fD(zz,function(zzz){ callback(zzz); }); }); }); }); }); }
请注意,您不返回,而是传递了一个回调。