web-dev-qa-db-ja.com

NodeJSの「完了」属性とは何ですか?

このチュートリアルに従って、NodeJSでローカルログインをコーディングしています。

https://scotch.io/tutorials/easy-node-authentication-setup-and-local

ファイルconfig/passport.js内

function(req, email, password, done){
    process.nextTick(function(){
        User.findOne({'local.email' :   email}, function(err, user){
            if(err)
                return done(err);
            if (user){
                return done(null, false, req.flash('signupMessage', 'message'));
            }

私はNodeJSとJavascriptのルーキーであり、「done」のような値がどのように関数になり得るかを理解していません(return done(err))。システム機能はありますか?

どうもありがとう!

20
David Luque

doneはコールバックで、作業が完了したら呼び出す必要があります。ご覧のとおり、コードの最初の行に記載されています。

function(req, email, password, done){

これは、着信要求に加えて、ユーザー指定のemailおよびpasswordを取得することを意味します。ログインを確認するために必要なことは何でもする必要があります。どういうわけか、成功したかどうかをPassportに伝える必要があります。

通常、これには戻り値を使用できますが、この場合、Passportの作成者は、チェックが非同期である可能性があるオプションを考えたため、戻り値を使用しても機能しません。

これが、コールバックが使用されている理由です。ほとんどの場合、コールバックはcallbackと呼ばれますが、これは便宜上のものであり、技術的な理由はありません。この場合、コールバックはdoneであることを示すために使用されているため、Passportの作成者はdoneと呼ぶことを提案しました。

資格情報の検証に失敗した場合はエラーで、または成功したことを示す適切なパラメーターを使用して、doneを呼び出すことができます。

これが機能するのは、関数がJavaScriptでいわゆるfirst-class citizensであるためです。つまり、コードとデータの間に実際の違いはありません。JavaScriptでは、 。

以上です :-)

32
Golo Roden

JavaScriptでは、関数はファーストクラスオブジェクトです。

これらは変数に格納され、他のデータと同様に渡されます。

関数宣言は、現在のスコープで、関数と同じ名前の変数を作成します。

function call_done(done) {
    done();
}

function some_function () {
    alert("Ta da");
}

call_done(some_function);
8
Quentin