ES6 的“奇葩”执行,yield 相关
发布于 14 小时前 作者 g8up 236 次浏览 最后一次编辑是 9 小时前 来自 问答

工程(Koa、koa-router、sequelizejs、sqlite3)里有这么一段函数作为路由的 handler。 向 ret 对象里插入新的属性,循环插入的过程可以看到正常执行,但循环之后返回的结果却是 {}。

"use strict"
var Host = require('../model/Host.js');

module.exports = {
	getList: function* ({
		platform = 'audit'
	}) {
		var hosts = yield Host.findAll();// 通过 sequelize 模块读取数据库
		var ret = {};
		hosts.forEach( host => { // ? 难道这里有异步?
			host = host.dataValues;
			let owner = host.owner;
			if (!ret[owner]) {
				ret[owner] = [];
			}
			ret[owner].push( host );
			console.log( ret[owner] );// 此处可以正常打印出 push 进去的 对象
		});
		console.log('ret', ret )// {} 这里竟然为空(如果放到 setTimeout 里,输出才符合预期)
		return ret;
	}
}
10 回复

forEach没有异步。。。。是自己数据问题吧

大神,这是ES6语法来的。箭头函数。

hosts可能不是个raw Array,可能是一个具有类似array接口的东西,forEach实际是异步执行的实现。上面都是我猜的。

@valaxy 我也觉得诡异,直觉是与 yield 有关,我对 generator 不太熟悉。

@anotherWill 在箭头函数内访问 ret 变量符合预期,在循环之后 ret 就是 {}。但是加了 setTimeout 又符合预期。

@g8up es6的作用域不同吧。es6有块级作用域。

去除 getList 的参数后,一切平静了。

那他们的打印顺序呢?

如果 console.log(ret) 在后面的话,没理由里面没东西啊。

sequelize 不可能去替代 foreach 函数的我觉得。 @magicdawn @valaxy

回到顶部