1

全て。最後に res 値を返すために asyncjs の waterflow メソッドを使用していますが、次のコードは未定義の値を返します。

var async = require("async");
User.findBy = function(name,password){
  async.waterfall([
      function fetch(callback){
        db.lrange("users",0,-1,function(err,users){
          users.forEach(function(item){
            var u = JSON.parse(item);
            if ((u.name == name) && (u.password == password)){
              console.log(u);
              callback(null,u);
              return;
            }
          });
        });
        callback(null);
      }
      ],function end(err,res){

        setTimeout(function(){
        // I want to return res value at last.
        return u;
        },0);
      });
};

app.js

 // but it returns undefined value.
 var user = User.findBy("nobinobiru",a");

何か考えはありますか?助けてください。前もって感謝します。

4

1 に答える 1

1

fetch 関数では、callback(null); を呼び出します。db.lrange 呼び出しの直後。db からの結果を待つ必要があるため、ここではこの呼び出しは不要です。

このコードは正常に動作するはずです:

var async = require("async");
User.findBy = function(name,password){
    async.waterfall([
        function fetch(callback){
            db.lrange("users",0,-1,function(err,users){
                var user;
                if (users && users.length) {
                    users.forEach(function(item){
                        var u = JSON.parse(item);
                        if ((u.name == name) && (u.password == password)){
                            console.log(u);
                            user = u;
                            return;
                        }
                    });
                    callback(null,user);
                } else {
                    callback(null);
                }
            });
        }
    ],function end(err,res){

        setTimeout(function(){
            // I want to return res value at last.
            return res;
        },0);
    });
};
于 2012-08-04T13:24:47.970 に答える