准备一个function,重复使用发电机运行

我正在使用一个nodejs telnet实现,它使用一个事件来提供通知,每次从远程login客户端接收数据时,可以按如下方式进行订阅:

client.on('data', [callback]); 

我也使用了一个生成器runner(npm上的generator-runner)来执行工作stream。

我遇到的问题是,以这种方式产生值需要更多的承诺:传递一个委托来处理单个值。 我将如何去编写一个可以放置在生成器yield函数中的函数,并且每当我想要产生更多的input时可以重复这个函数?

我已经尝试过使用Baconjs,但是我不认为有阻止在stream上等待一个值的方法,至less我找不到这样的方法。

我愿意接受任何build议。 我唯一真正的要求就是能够将我的工作stream程放在一个平坦的代码块中,而不用链接承诺。

这里是我嘲笑的代码,这根本不起作用:

 var requirejs = require('requirejs'); requirejs(['telnet', 'baconjs', 'colourise', 'lodash', 'generator-runner'], function(Telnet, Bacon, Colourise, _, Async) { var configureClient = client => { client.do.transmit_binary(); }; Telnet.createServer(client => { var session = { connectedAt: Date.now(), user: { } }, write = _.compose(_.bind(client.write, client), Colourise.encode), readStream = Bacon.fromBinder(function (sink) { client.on('data', function (data) { sink({ client : client, data : data, session : session }); })}), read = () => readStream.take(1).toPromise(); configureClient(client); write("%xxWelcome!\r\n") Async(function*(){ write("Username: "); var user = yield read(); console.write("Username entered: " + user); write("Password: "); var password = yield read(); console.write("Password entered: " + password); }); }).listen(8100); }); 

我已经通过使用Baconjs中的'fromEvent'并使用'firstToPromise'来完成这个工作。 我收到'fromBinding'抛出的exception,所以我不知道那里是什么,但是它减慢了我的进度。

以下是简化和工作代码。 需要ES6(我使用了节点标志–harmony和–harmony_generators。)

在附注中,我对这种技术的含义非常兴奋!

 var requirejs = require('requirejs'); requirejs(['telnet', 'baconjs', 'generator-runner', 'lodash'], function(Telnet, Bacon, Async, _) { var configureClient = client => { client.do.transmit_binary(); }; Telnet.createServer(client => { var write = _.bind(client.write, client), readStream = Bacon.fromEvent(client, 'data'), readAsync = () => readStream.firstToPromise(); configureClient(client); write("Welcome!\r\n") Async(function*(){ write("Username: "); var user = yield readAsync(); console.log("Username entered: " + user); write("Password: "); var password = yield readAsync(); console.log("Password entered: " + password); }); }).listen(8100); } );