【发布时间】:2014-09-17 23:48:29
【问题描述】:
有没有人尝试让 Underscore JS 或 lodash(或任何 ES5 标准函数)与生成器一起工作?
如果我们有一个数组var myArray = [1,2,3,4,6];
我们希望 forEach 覆盖它。
在非生成器的情况下,您只需
myArray.forEach(function(k) {
console.log(k);
});
但是,当你不能在非生成器函数中产生时,所以如果在这个循环中我们必须做一些异步工作,你需要做以下事情。
var foreach = function* (arr, fn) {
var i;
for (i = 0; i < arr.length; i++) {
yield * fn(arr[i], i);
}
};
yield* foreach(myArray, function* (k) {
var a = yield fs.readFile();
});
哪一种很烂。
有人知道如何让匿名函数与生成器一起工作吗?因此,我们有点失去了整个 lodash 库。
注意:我正在使用 Traceur 将我的代码编译成 ES6 并打开生成器。
注意:我没有使用 co()。我正在使用如下所示的自定义生成器函数
var run = function(generatorFunction) {
var generatorItr = generatorFunction(resume);
function resume(callbackValue) {
generatorItr.next(callbackValue);
}
generatorItr.next();
};
【问题讨论】:
-
也许只有我一个人,但我不明白到底是什么问题。这听起来更像是问题正在使用例如
forEach带生成器。 -
嗯,是的,但这不是真正的*问题。问题是在非生成器函数中使用 yield。哪个 ForEach 将使用 90% 的时间。更不用说 _.find()、_.filter()、Array.reduce()、Array.forEach()、Array.map()。如果你需要在里面产生任何东西,所有这些都是无用的。
-
如果是
forEach,您可以简单地使用for (var e of arr) { yield doSomethingWith(e); }或普通的for循环。对于filter或reduce等其他方法,我看不出使用生成器会有什么用处。filter回调必须返回一个布尔值。在这里使用生成器到底有什么意义? -
好吧,我能想到的任何答案都是低效的代码。在循环中做工作。但是无论如何,如果您有一个 mp3 url 列表,并且您需要将该列表过滤到文件系统中实际存在的列表。你通常会在你的列表上做一个过滤器,在每次迭代时检查 FS,并在它们都完成时检查 Promise.all()。使用生成器我们不能使用过滤器。我们必须循环并存储第二个结果数组。
-
@SeanClark:请注意,
Promise.all将并行启动 fs 查询,而您似乎正在寻找的生成器解决方案将是顺序的。
标签: javascript function generator ecmascript-6 yield-keyword