Используя узел js и redis - получите читаемый код - PullRequest
0 голосов
/ 22 февраля 2012

Может быть, это простой и глупый вопрос, но я просто изучаю свой первый асинхронный серверный язык, а redis - это мой первый ключ-значение. Db.

Пример.Мне нужно сделать это:

$x = users:count
get user:$x

Но с помощью асинхронного javascript я получаю этот код

redis-cli.get('users:count', function(err, repl){
  if(err){
    errorHandler(err);
  } else {
    redis-cli.get('user:'+repl, function(err, repl){
      if(err){
        errorHandler(err);
      } else {
        console.log('We get user '+repl+'!')
      }
    })
  }
})

Этот код не такой большой и не слишком много вложенный, но на мой первый не похожПример / тестовый проект Я получаю сумасшедшие вложенные функции-обратные вызовы.

Как решить эту проблему и создать красивый и читаемый код?

1 Ответ

2 голосов
/ 22 февраля 2012
function getUserCount(callback, err, repl) {
  if (err) {
    return callback(err);
  }
  redis-cli.get('user:' + repl, getUser.bind(null, callback));
}

function getUser(callback, err, repl) {
  if (err) {
    return callback(err);
  }
  console.log('We get user ' + repl + '!');
}

redis-cli.get('users:count', getUserCount.bind(null, errorHandler));

bind творит чудеса.Если вы предпочитаете, чтобы привязка была абстрагирована, вы можете использовать this для хранения состояния, которое обычно хранится в замыканиях, таких как:

require("underscore").bindAll({
  run: function (errorHandler) {
    this.errorHandler = errorHandler;
    redis-cli.get('users:count', this.getUserCount);
  },
  getUserCount: function (err, repl) {
    if (err) return this.errorHandler(err);
    redis-cli.get('user:' + repl, this.getUser);
  },
  getUser: function (err, repl) {
    if (err) return this.errorHandler(err);
    console.log('got user ', repl);
  }
}).run(errorHandler);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...