gpt4 book ai didi

javascript - 从生成器内部使用的迭代器回调中产生

转载 作者:可可西里 更新时间:2023-11-01 02:12:52 25 4
gpt4 key购买 nike

有没有人尝试让 Underscore JS 或 lodash(或与此相关的任何 ES5 标准函数)与生成器一起工作?

如果我们有一个数组 var myArray = [1,2,3,4,6];我们想要 forEach。

在非生成器的情况下,您只需

myArray.forEach(function(k) {
console.log(k);
});

但是,当您不能在非生成器函数内 yield 时,因此如果在此循环内我们必须执行一些异步工作,则您需要执行以下操作。

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();
};

最佳答案

如果我对您的问题的理解正确,那么本质上您是在尝试以一种异步的方式,使用一种真正围绕同步性设计的语言 (JS) 来做某事(迭代直到找到一个好的停止点)。换句话说,虽然您通常可以这样做:

_([1,2,3]).any(function(x) {
var shouldWeStopLooping = x % 2 == 0;
return shouldWeStopLogging;
});

你反而想让“我们应该停止循环”的代码从正常执行中中断,然后再回来,这对于传统的 JS 是不可能的(yield 对语言来说是相对较新的)因此在 Underscore/Lodash 中是不可能的:

_([1,2,3]).any(function(x) {
var shouldWeStopLooping = $.ajax(...); // Doesn't work; code keeps going
return shouldWeStopLogging;
});

您可以采用两种方法,但都不是理想的方法。

如评论中所述,一种方法是先完成所有“延迟”工作,然后迭代:

var workInProgress = _([1,2,3]).map(someAjaxOperation);
$.when.apply(workInProgress).done(doSomethingBasedOnAjaxResults);

但是(正如评论中也指出的那样)这并不完全相同,因为您最终会对数组的所有元素进行 AJAX 处理(相对于一个真正的生成器,它只会迭代尽可能多的元素)需要找到一个“赢家”)。

另一种方法是消除异步性。 jQuery 允许您将 async: false 传递给 AJAX 请求,这通过让您使用 Underscore/Lodash/whatever 来“解决”问题......但它也会锁定用户的浏览器,只要它需要完成 AJAX 工作,这可能不是您想要的。

不幸的是,如果你想使用像 Underscore/Lodash 这样的库,这些是我能看到的唯一选项。您唯一的其他选择是编写您自己的 Underscore/Lodash mix-in,这真的不难。我建议这样做,因为它允许您仍然利用这些库中的所有其他强大功能,同时仍然以一致的方式进行迭代。

关于javascript - 从生成器内部使用的迭代器回调中产生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24967314/

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