Как связать возвраты в nodejs с ioredis?

Я использую ioredis и хочу полностью вернуть путь и значение в приведенном ниже примере. к анонимной функции.

console.log(
    function (jsonGraphArg) {
        return Redis.hget(jsonGraphArg[0], jsonGraphArg[1], function(error, result){
             result = JSON.parse(result);
             return {
                 path: [jsonGraphArg[0], jsonGraphArg[1], jsonGraphArg[2][0]],
                 value: result[jsonGraphArg[2][0]]
             };
        });
    }
);

Я ожидаю, что результат будет примерно таким в console.log():

{
    path: "something",
    value: "something else"
}

Но вместо этого он дает мне:

{
  _bitField: 1,
  _fulfillmentHandler0: [Function: successAdapter],
  _rejectionHandler0: [Function: errorAdapter],
  _progressHandler0: undefined,
  _promise0: [Function],
  _receiver0: [Circular],
  _settledValue: undefined
}

person Bob van Luijt    schedule 26.08.2015    source источник


Ответы (2)


Прежде всего, вы пытаетесь зарегистрировать объявление функции вместо результатов выполнения функции.

console.log(
    (function (jsonGraphArg) {
        return Redis.hget(jsonGraphArg[0], jsonGraphArg[1], function(error, result){
             result = JSON.parse(result);
             return {
                 path: [jsonGraphArg[0], jsonGraphArg[1], jsonGraphArg[2][0]],
                 value: result[jsonGraphArg[2][0]]
             };
        });
    })();
);

Этот код даст вам результат выполнения функции.

Вторая проблема заключается в том, что Redis.hget является асинхронной функцией. Чтобы получить результаты, как только Redis вернет их, вам нужно использовать обратный вызов.

var callback = function(res) {
    console.log(res);
}

(function (jsonGraphArg, callback) {
    return Redis.hget(jsonGraphArg[0], jsonGraphArg[1], function(error, result){
         result = JSON.parse(result);
         return callback({
             path: [jsonGraphArg[0], jsonGraphArg[1], jsonGraphArg[2][0]],
             value: result[jsonGraphArg[2][0]]
         });
    });
})();

С помощью этого кода, когда Redis возвращает данные, он вызывает функцию callback с аргументом res, который будет вашим объектом со свойствами пути и значения.

person ezpn    schedule 26.08.2015
comment
Спасибо за подсказку, хотя мой ответ был в обещании then() :-) - person Bob van Luijt; 27.08.2015

Ответ был в обещании

console.log(
    function (jsonGraphArg) {
        return Redis.hget(jsonGraphArg[0], jsonGraphArg[1]).
        then(function(result){
             result = JSON.parse(result);
             return {
                 path: [jsonGraphArg[0], jsonGraphArg[1], jsonGraphArg[2][0]],
                 value: result[jsonGraphArg[2][0]]
             };
        });
    }
);
person Bob van Luijt    schedule 27.08.2015