3

私は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" を取得する前に、"ret" がまだ使用できないため、2 番目の関数がパラメーター "undefined" で実行され、エラーが発生します。

最初の関数の実行が完了した後にのみ、2 番目の関数を実行するにはどうすればよいですか。

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);
}
});

私のコードを実装する答えを教えてください。ありがとう

4

2 に答える 2

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);
于 2012-04-17T06:15:11.023 に答える
0

次のような一般的なパターンの周りのいくつかの素晴らしいラッパーについては、node-asyncライブラリを調べてください:https ://github.com/caolan/async

シリーズまたはウォーターフォールのいずれかがユースケースに適しているようです。

于 2012-04-17T21:16:34.977 に答える