来自函数调用JavaScriptpt的未定义返回值
我试图获取返回值,但总是未定义来自函数调用JavaScriptpt的未定义返回值,javascript,node.js,scope,undefined,Javascript,Node.js,Scope,Undefined,我试图获取返回值,但总是未定义 var hasNext; es.search(nextQuery, function (err, data) { if(data.hits.hits.length) { return hasNext = true; } return hasNext = false; }); 我不知道如何才能得到返回值并在其他地方使
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
回调:
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
返回某些内容,那么还需要向其添加回调,以便使用它的返回值。例如,如果您希望这样做:
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);
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);
});
});
});
});
});
}
为此:
asyncFunction(function(data){
doSomething(data);
});
基本上,将异步函数之后要运行的所有代码移到传入的回调函数中
常规命令式代码如下所示:
asyncFunction(function(data){
foo = data;
});
doSomething(foo);
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);
});
});
});
});
});
}
异步代码如下所示:
asyncFunction(function(data){
foo = data;
});
doSomething(foo);
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);
});
});
});
});
});
}
请注意,您不返回,而是传入回调。这是因为
es.search
是一个异步函数,因此它调用后的所有内容都会立即执行,而不是返回时。依赖于es.search
结果的任何逻辑都应该进入正在设置hasNext
的回调中。@go oleg是否存在我可以定义的全局值或至少可以将其返回给其他函数的内容?如果此代码段属于某个函数,然后该函数本身也应该是异步的,并且应该将回调作为一个参数,当它完成时调用该参数,类似于es.search
的工作方式。ermm。。。我认为我的方法太复杂了,无法将返回值返回到我现在真正想要的位置:(首先我有一个名为“getAllPost”的函数,这个函数只是一个同步函数,它将从elasticsearch检索所有帖子,然后我有另一个名为“hasNext”的函数这是一个异步函数,在它里面我有一个es.search,它也是异步的。现在我能返回到“getAllPost”吗?你能发布它们吗?