2013-08-25 4 views
0

Используя node.js, я подключаюсь к моей базе данных redis и возвращаю значения в массив. Однако, чтобы вернуть значения, я должен использовать функцию обратного вызова, чтобы вывести их из области видимости. Я видел много примеров на SO функций обратного вызова в действии, и мои работы работают так же, как и все остальные, которые я видел, однако, когда я вызываю функцию как опцию в res.render, она пытается вернуть родительскую функцию, а не обратный вызов. Как вернуть значение функции обратного вызова в параметр players:?Возвращаемое значение обратного вызова Javascript

Родитель Функция

function openPlayers(callback) { 
    var players = []; 
    db.hgetall("players", function(err, objs) { 
    // Objects of Response 
    for (var k in objs) { 
     // Items are the individual key-value object 
     var newPlayer = {}; 
     var items = JSON.parse(objs[k]); 
     for (var x in items) { 
     // x is the key for each object 
     newPlayer[x] = items[x]; 
     } 
     players.push(newPlayer); 
    } 
    callback(players); 
    }); 
} 

Расположение Callback функции

exports.newPlayer = function(req, res) { 
    res.render('newPlayer', { 
    title: 'New Player', 
    players: (openPlayers(function(ps) { //callback function 
       return(ps); 
      })) 
    }); 
}; 
+3

Возврат из асинхронного обратного вызова бесполезен. Вы должны инвертировать логику и вызвать res.render из своего обратного вызова. – bfavaretto

ответ

4

Ну, вы не можете, так как openPlayers является асинхронной и не возвращает никакого значения, поэтому он принимает обратный вызов. Однако вы можете сделать что-то вроде этого:

exports.newPlayer = function(req, res) { 

    openPlayers(function (ps) { 
     res.render('newPlayer', { 
      title: 'New Player', 
      players: ps 
     }); 
    }); 
}; 
+1

Хорошо, хорошо ... этот асинхронный материал смешон. Большое спасибо за отличный ответ! –