2016-05-11 12 views
0

以下のコードを参照してください。すべてのreturnキーワードを削除すると、関数は引き続き期待どおりに動作し、callback()とコールバック)約束して混ぜ合わせるとき約束の中のreturn callback()とcallback()

誰かが私に説明することができますか?returnはどれですか?

は、今まで実行された関数done()ですか?

const localLogin = new LocalStrategy(localOptions, (email, password, done) => { 
    User.find({ where: { email } }).then(user => { 
    if (!user) { 
     return done(null, false); 
    } 
    return user.validPassword(password, (err, isMatch) => { 
     if (err) { 
     return done(err, false); 
     } 
     if (!isMatch) { 
     return done(null, false); 
     } 
     return done(null, user); 
    }); 
    }).catch(err => { 
    return done(err, false); 
    }); 
}); 
+0

Promiseを 'done()'してもいいですか? –

+1

あなたは本当に 'user.validPassword'メソッドを約束しなければなりません。 – Bergi

+0

いいえ、すべての 'return'キーワードを削除しても、関数は同じ動作をしません。 – Bergi

答えて

1

これらのreturnは、単にuser.Findとuser.validPasswordコールバックの実行を中断します。一例として、次のように他の条件によって置き換えることができます。

const localLogin = new LocalStrategy(localOptions, (email, password, done) => { 
    User.find({ where: { email } }).then(user => { 
     if (!user) { 
      done(null, false); 
     } 
     else { 
      user.validPassword(password, (err, isMatch) => { // return at this point is not needed, because there is nothing to break after this function 
       if (err) { 
        done(err, false); 
       } 
       else{ 
        if (!isMatch) { 
         done(null, false); 
        } 
        else { 
         done(null, user); 
        } 

       } 
      }); 
     } 
    }).catch(err => { 
     done(err, false); 
    }); 
}); 

あなたが見ることができるように、returnは、多くの他の条件を取り除くことができます。

+0

これを明確にしていただきありがとうございます。今私はこれが悪い質問であると感じます。私は本当にプロミスと混合コールバックを返すすべてのコールバックと混同していると思います。 – xiaofan2406

関連する問題