1

「検証」関数を渡す必要があるライブラリを使用しています。この関数では、いくつかの入力を検証し、それが成功したか失敗したtrueかを返す必要がありfalseます。

問題は、この検証関数のデータベースにユーザーが存在するかどうかを確認する必要があり、Mongoose がその結果でコールバックを呼び出すことです。コールバック内にある場合return、検証関数ではなくコールバック関数から返されます。

...
validate: function (username) {
    User.findOne({ username: username }, function (err, user) {
        if (user)
            // User exists so we should return false from the validate function
        else
            // User does not exist so we should return true from validate.
    });
}

これを解決するために非同期ライブラリを使用しようとしていますが、非同期は完了時にコールバックも呼び出します!

4

2 に答える 2

2

簡単な答え: できません。

すべての意図と目的において、 JavaScript はシングルスレッドです。はい、コールバックとマルチスレッド ( setTimeoutsetInterval、イベント コールバック) がありますが、コールバックから飛び出して同じ関数に戻ることはできません。

私のアドバイスは、 が呼び出される前にこの検証を前処理しvalidateて、 内で作業するための "yay or ney" の結果が得られるようにすることですvalidate

于 2013-09-26T20:28:28.197 に答える
0

これを実現するためにpromiseを使用できます。

var q = require('q');

validate: function (username) {
    var deferred = q.defer();
    User.findOne({ username: username }, function (err, user) {
      if (err){return deferred.reject(err)}
      if (user)
        // User exists so we should return false from the validate function
        deferred.resolve(false);
      else
        // User does not exist so we should return true from validate.
        deferred.resolve(true)
    });
    return deferred.promise;
 }

そして、以下のように検証機能を使用します。

validate('username').then(function(result){
  if (result)
     console.log('user doesnt exist');
  else
     console.log('user exists');

}, function(err){
   if(err)
      console.log('Error', err); 
})
于 2013-09-26T21:04:30.690 に答える