【发布时间】:2015-05-12 11:40:24
【问题描述】:
我正在编写一些 node.js 以通过串行端口连接与传感器进行交互。读取传感器的代码自然是异步的。不过,在我的控制代码中,我需要读取传感器、根据值执行某些操作、再次读取、执行其他操作等。为此,我使用了类似以下独立测试的代码:
var main = new Main();
main.next();
function* Main()
{
var reading = yield readSensor(this.next.bind(this));
console.log(reading);
var reading = yield readSensor(this.next.bind(this));
console.log(reading);
}
function readSensor(callback)
{
// simulate asynchrounous callback from reading sensor
setTimeout(function sensorCallback() { callback('foo'); }, 100);
}
所以,我的顺序控制代码在一个生成器中,当它需要读取时,它会生成readSensor()。当传感器读取完成时,它调用回调,控制返回到主代码。我这样做是因为我可能需要根据以前的读数以不同的顺序从各种传感器读取数据。所以,这是有问题的部分:我将this.next.bind(this) 作为回调传递给异步读取函数。启用生成器时代码似乎可以工作(--harmony_generators),但我想知道这里是否存在我遗漏的陷阱。我对 JS 比较陌生,所以不要害怕指出显而易见的:)
【问题讨论】:
-
我认为你不能像构造函数那样调用 ES6 生成器。也许这是一个v8错误?让我检查一下。
-
@Bergi 我查看了最新的 ES6 草案规范,但无法确定是否支持。我认为应该是;这将是一种处理嵌套回调问题的轻量级、相对干净的方法。当然,即使您不能将生成器构造为对象以使它们具有
this,您也可以通过初始main.next(main);调用将其“自我”发送给它们,并以初始yield接收。但是,就目前而言,Q.async 库似乎可以满足我的需求。 -
我现在已经详细研究了 ES6 草案,可以证实我的怀疑。看我的回答:-)
标签: javascript node.js yield