Node.JS MySQL Callback - PullRequest
       18

Node.JS MySQL Callback

0 голосов
/ 17 января 2012

Поскольку Node является асинхронным, у меня возникают проблемы с попыткой обратного вызова для правильного возврата значений.

Я пробовал следующее:

var libUser = {
    lookupUser: {},
    getName: function(userID) {
        // If it's in our cache, just return it, else find it, then cache it.
        if('userName_' + userID in this.lookupUser) {
            return this.lookupUser['userName_' + userID];
        }else{
            // Lookup the table
            var userName;
            this.tableLookup(["agent_name"], "_login_", " WHERE agent_id = " + userID, function(d) {
                userName = d[0].agent_name;
            });

            this.lookupUser['userName_' + userID] = userName; // Add to cache

            return userName;
        }
    },
    tableLookup: function(fields, table, clauses, cb) {
        var query = "SELECT " + fields.join(", ") + " FROM " + table + " " + clauses;
        client.query(query, function(err, results) {
            if(err) console.log(err.error);

            cb(results);
        });
    }
};

Однако, очевидно,Из-за условий гонки переменная userName никогда не устанавливается обратным вызовом из this.tableLookup.

Так как же мне вернуть это значение?

1 Ответ

7 голосов
/ 17 января 2012
 var userName; // user name is undefined
 this.tableLookup(["agent_name"], "_login_", " WHERE agent_id = " + userID, function(d) {
     // this will run later
     userName = d[0].agent_name;
 });

 // username still undefined
 return userName;

Так что исправьте свой код

getName: function(userID, cb) {
    var that = this;
    // If it's in our cache, just return it, else find it, then cache it.
    if ('userName_' + userID in this.lookupUser) {
        cb(this.lookupUser['userName_' + userID]);
    } else {
        // Lookup the table
        var userName;
        this.tableLookup(["agent_name"], "_login_", " WHERE agent_id = " + userID, function(d) {
            userName = d[0].agent_name;

            that.lookupUser['userName_' + userID] = userName; // Add to cache
            cb(userName);
        });
    }
},

и используйте

libUser.getName(name, function (user) {
  // do something
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...