有没有人试图获得Underscore JS或lodash(或任何ES5标准功能)与发电机工作?
如果我们有一个数组var myArray = [1,2,3,4,6];
我们想要通过它.
在一个非发电机的情况下,你会简单的
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(); };
解决方法
如果我正确地理解你的问题,那本来就是以一种异步的方式来进行某些操作(迭代到一个很好的停顿点),这个语言(JS)是真正围绕同步设计的.换句话说,虽然你通常可以做:
_([1,3]).any(function(x) { var shouldWeStopLooping = x % 2 == 0; return shouldWeStopLogging; });
你反而希望使“我们应该停止循环”代码中断从正常的执行,然后回来,这是不可能的传统的JS(收益是相对较新的语言),因此是不可能的在Underscore / Lodash :
_([1,3]).any(function(x) { var shouldWeStopLooping = $.ajax(...); // Doesn't work; code keeps going return shouldWeStopLogging; });
正如评论中所提到的,一种方法是先做所有的“推迟”工作,然后重复:
var workInProgress = _([1,3]).map(someAjaxOperation); $.when.apply(workInProgress).done(doSomethingBasedOnAjaxResults);
但是(同样在评论中也注意到)并不完全相同,因为您在数组的所有元素(与一个真正的生成器)之间进行AJAX工作时,只需要遍历尽可能多的数量来查找“赢家”).
另一种方法是消除异步. jQuery允许您将async:false传递给AJAX请求,该请求通过让您使用Underscore / Lodash / any …来解决问题,但它也会锁定用户的浏览器,只要执行AJAX工作即可,这可能不是你想要的.
不幸的是,如果你想使用一个像Underscore / Lodash这样的图书馆,那我们可以看到的唯一选择.您唯一的其他选择是编写自己的Underscore / Lodash组合,这真的不是那么难.我建议这样做,因为它将允许您仍然利用这些库中的所有其他伟大的功能,同时仍然以一致的方式进行迭代.