2016-01-04 7 views
0

У меня есть следующий nodeJS-код. Мне нужно получить машины для каждой службы из базы данных redis. Я использую библиотеку «q» для упрощения проблемы обратного вызова. Однако я не получаю выход.ошибка при использовании узла библиотеки QJS

Я новичок в node/callbacks/q. Где моя ошибка в коде?

У меня есть controller.js файл со следующим кодом

function getMachines(services) { 
    var machines = Q.fcall(function() {}); 
    services.forEach(function(service) { 
    var value = function() { 
     var deferred = Q.defer(); 
     redisDB.readfromRedis(service, function(result) { 
     deferred.resolve(result); 
     }); 
     return deferred.promise; 
    } 
    }); 
    return machines; 
} 

testController.js (вызов функции getMachines от controller.js)

var services = ['dashDb22', 'service1', 'service2', 'service3'] 
var output = controller.getMachines(services) 
console.log(output); 

RedisDb.js

function readfromRedis(key, callback) { 
    client.smembers(key, function(error, value) { 
    if (error) { 
     throw error; 
    } 
    console.log('VALUE IS: = ' + value); 
    callback(value); 
    }); 
} 
+0

Вы создали функцию 'value', но не вызываете ее. – zerkms

ответ

1

Ваш getMachines() не делает много, machines бесполезен и внутри вашего forEach() вы сохраняете функцию, которую вы никогда не выполняете. Ваш код прост, вам не нужно использовать Q, у nodejs есть встроенная поддержка Promise.

function getMachines(services) { 
    // create an array of promises 
    var myPromises = services.map(function (service) { 
     // for each service, create a Promise 
     return new Promise(function (resolve, reject) { 
      redisDB.readfromRedis(service, function (result) { 
       resolve(result); 
      }); 
     }); 
    }) 
    // takes an array of promises and returns a promise for when they've all 
    // fulfilled (completed successfully) with the values as the result 
    return Promise.all(myPromises); 
} 

getMachines(services).then(function (machines) { 
    // use machines here 
}); 

Вы также могли бы сделать readfromRedis() обещание сделать его более простым в использовании.

Смежные вопросы