JavaScript – 从生成器中使用的迭代器回调产生

前端之家收集整理的这篇文章主要介绍了JavaScript – 从生成器中使用的迭代器回调产生前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
有没有人试图获得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组合,这真的不是那么难.我建议这样做,因为它将允许您仍然利用这些库中的所有其他伟大的功能,同时仍然以一致的方式进行迭代.

猜你在找的JavaScript相关文章