gpt4 book ai didi

Javascript 奇怪的生成器 yield 子函数行为

转载 作者:可可西里 更新时间:2023-11-01 07:56:03 24 4
gpt4 key购买 nike

我在一个简单的项目中使用 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 的实际代码在模型类中,因此我不希望将它与 Controller 合并。

我在子测试函数上尝试了很多不同的方法,有或没有 yield。

这是怎么回事?

最佳答案

subtest1(conn, values) 是一个生成器。 yield生成器对象不会执行其主体。也就是说,yielded 生成器保持挂起状态,并且需要调用 next() 方法才能达到第一个 yield代码示例 2 中没有对 next() 的显式或隐式调用,这就是 conn.query(...) 的原因没有被执行。

yield* subtest1(conn, values)怎么样? ?从链接页面:

The yield* expression iterates over the operand and yields each value returned by it.

它仍然会延迟执行subtest

另一种解决方案是将 subtest 变成一个常规函数并返回 conn.query(...) 的结果(假设您只需要执行一个查询):

function subtest1(conn, values) {
return conn.query("INSERT INTO version SET ?", values);
}

关于Javascript 奇怪的生成器 yield 子函数行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34253463/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com