我正在一个简单的项目中使用MySQL (
这个很好用。上述行被插入。我不知道MySQL驱动程序允许如此简单的插入函数,但确实可以。
mysql-co
)和ASQ(asynquence
),以更好地理解ES6生成器和yield函数,并且在奇怪的行为上遇到了难题。
asynquence
(https://github.com/getify/asynquence)提供了一种简单的方式来按顺序运行生成器。它还可以执行伪并行操作,但我现在不需要。 function *x(token)
的结构就是从这里来的。token
在[0]
处保存一个连接对象。 yield token
将控制权传递给序列中的下一个生成器函数。
代码示例1(有效)
function *test1(token) {
var conn = token.messages[0];
var values = {id:1, dev:1, description:'This is it!'};
yield conn.query("INSERT INTO version SET ?", values);
yield token;
}
这个很好用。上述行被插入。我不知道MySQL驱动程序允许如此简单的插入函数,但确实可以。
代码示例2(不起作用)
function *test1(token) {
var conn = token.messages[0];
var values = {id:1, dev:1, description:'This is it!'};
yield subtest1(conn, values);
yield token;
}
function *subtest1(conn, values) {
yield conn.query("INSERT INTO version SET ?", values);
}
这行代码不起作用。实际上,subtest1的相关代码在一个模型类中,所以我希望它不要与控制器合并。
我已经尝试了许多不同的方法,包括在subtest函数上使用或不使用yield。
出了什么问题?
yield
生成器对象并不会启动其执行”这里有些棘手的措辞。它确实会启动,因为它调用函数并返回迭代器。只是它不会遍历返回的内容,而是在当前test1
迭代中产生实际的迭代器对象。(虽然+1) - T.J. Crowder