是否有人尝试使用生成器来获取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();
};
答案 0 :(得分:0)
如果我正确理解您的问题,那么本质上是您尝试以某种语言(JS)以异步方式执行某些操作(迭代直到找到一个好的停止点)这是真正围绕同步性设计的。换句话说,虽然你通常可以这样做:
_([1,2,3]).any(function(x) {
var shouldWeStopLooping = x % 2 == 0;
return shouldWeStopLogging;
});
你想要制作&#34;我们应该停止循环&#34;代码从正常执行中断,然后返回,传统的JS是不可能的(yield
对于语言来说相对较新),因此在Underscore / Lodash中是不可能的:
_([1,2,3]).any(function(x) {
var shouldWeStopLooping = $.ajax(...); // Doesn't work; code keeps going
return shouldWeStopLogging;
});
您可以采取两种方法,但这两种方法都不理想。
正如评论中所提到的,一种方法是做你所有的&#34;延期&#34;首先工作,然后迭代:
var workInProgress = _([1,2,3]).map(someAjaxOperation);
$.when.apply(workInProgress).done(doSomethingBasedOnAjaxResults);
但是(正如评论中所指出的那样)并不完全相同,因为你最终对阵列的所有元素进行AJAX工作(相对于只能迭代的真正的生成器)根据需要找到一个&#34;赢家&#34;)。
另一种方法是消除异步性。 jQuery允许您将async: false
传递给AJAX请求,其中&#34;解决了&#34;让你使用Underscore / Lodash /等等问题...但它也会锁定用户的浏览器,只要它能够完成AJAX工作,这可能不是你想要的。< / p>
不幸的是,如果你想使用像Underscore / Lodash这样的库,那么这是我能看到的唯一选择。你唯一的另一个选择是编写自己的Underscore / Lodash混合物,这真的不是那么难。我建议这样做,因为这样可以让你仍然利用这些库中的所有其他强大功能,同时仍然以一致的方式进行迭代。