Nodejs,等到当前请求完成,然后继续(或)等到firstfunction执行再转到第二个函数

时间:2012-04-17 05:57:03

标签: node.js

我使用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);
}
});

请告诉我实施我的代码的答案。 感谢

2 个答案:

答案 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

听起来系列或瀑布都适用于您的用例。