我使用nodejs代码:
var ret = firstfunction(); //this calls database and gets some return value
var output = secondfunction(ret); // in this function we used ret as parameter
在firstfunction()
完成之前,在它获得值“ret”之前,第二个函数使用参数“undefined”执行,因为“ret”尚不可用,从而导致错误。
只有在第一个函数完成执行后才能执行第二个函数。
var uname = "sachin";
var noqq=UserModel.find({uname:uname},function(err,user){
if(!err){
myid=user[0]._id; //SAVING myid here , I AM USING THIS IN THE NEX FUNCTION
return myid;
}else {
return null;
}
});
下面的函数应该只在完成一个之后执行,即仅在获得“myid”之后执行。
var ret=CollegeModel.findById(myid, function(err,colleges){
if(!err)
{
res.send(questions);
}
else {
res.send(err);
}
});
请告诉我实施我的代码的答案。 感谢
答案 0 :(得分:2)
使用Node,您必须学会异步执行操作。您可以使用其许多同步方法,但是您会失去完全无阻塞的好处。
因此,如果不知道firstfunction
中的内容,您可能会有一个异步方法。如果是这样,firstfunction
在返回异步方法之前返回(在内部,甚至可能没有调用它)。您需要做的是将secondfunction
发送到firstfunction()
。最简单的方法是将secondfunction
作为参数传递给firstfunction
。您的代码将如下所示:
var firstfunction = function(myCallback) {
var dbSuccessCallback = function(returedData) {
// the asynchronous call has retured successfully with data
myCallback(returnedData);
};
callDatabase("SELECT a FROM b", dbSuccessCallback);
}
firstfunction(secondfunction);
如果您在HTML中进行事件绑定,那么您可能已经非常习惯这样做了:
mydiv.addEventListener('click',function(){/* Do something */}, true);
或其他方式:
var myCallback = function(){
/* Do something */
};
mydiv.addEventListener('click',myCallback, true);
答案 1 :(得分:0)
在node-async库中查看一些关于常见模式的好包装器:https://github.com/caolan/async
听起来系列或瀑布都适用于您的用例。