虽然“yield”关键字的主要目的是为一些数据提供迭代器, 但它也非常方便用于创建异步循环:
function* bigLoop() {
// Some nested loops
for( ... ) {
for( ... ) {
// Yields current progress, eg. when parsing file
// or processing an image
yield percentCompleted;
}
}
}
这可以被异步调用:
function big_loop_async(delay) {
var iterator = big_loop();
function doNext() {
var next = iterator.next();
var percent_done = next.done?100:next.value;
console.log(percent_done, " % done.");
// start next iteration after delay, allowing other events to be processed
if(!next.done)
setTimeout(doNext, delay);
}
setTimeout(doNext, delay);
}
然而,在现代JavaScript中,基于回调的循环已经变得非常流行。我们有
Array.prototype.forEach
,Array.prototype.find
或Array.prototype.sort
。所有这些都是基于每次迭代传递的回调函数。我甚至听说如果可以使用它们,建议我们使用它们,因为它们可以比标准for循环更好地优化。我经常使用基于回调的循环来抽象出一些复杂的循环模式。
问题在于,是否可能将这些转换为基于
yield
的迭代器?作为一个简单的例子,考虑我想异步地对数组进行排序。