2015-05-26 1 views
2

У меня есть простой скрипт, который просто принимает все значения из списка Redis и печатает их на консоли.Бесконечный поток с Baconjs

var redis = require("redis"), 
    client = redis.createClient(); 
    Bacon = require('baconjs'); 

Bacon.repeat(function(){ 
    return Bacon.fromNodeCallback(
    client, 'lpop', ['errors'] 
); 
}) 
.takeWhile(function(val) {return val !== null;}) 
.fold(
    [], 
    function(acc, next) { 
     acc.push(next); return acc; 
    } 
).onValue(console.log); 

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

ответ

3

Простым решением является вызов process.exit внутри вашего обработчика onValue.

).onValue(function(value) { 
    console.log(value) 
    process.exit(0) 
}) 

РЕДАКТИРОВАТЬ: Вы можете написать пользовательский источник, который закрывает соединение, когда он больше не нужен.

Bacon.fromBinder(function(sink) { 
    var client = redis.createClient() 
    sink(new Bacon.Next(client)) 
    return function unsubscribe() { 
    client.quit() 
    } 
}).flatMap(function(client) { 
    return Bacon.repeat(function(){ 
    return Bacon.fromNodeCallback(
     client, 'lpop', ['errors'] 
    ); 
    }) 
}) 
+2

Привет, ваше решение работает. Но я считаю, что лучше. Я должен закрыть соединение redis с 'client.quit();' – kharandziuk

+0

Хорошо, я добавил код, который делает это с помощью Bacon. – OlliM

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

  • Нет связанных вопросов^_^