【发布时间】:2016-09-18 21:48:07
【问题描述】:
我在 node.js 中有一个批处理作业: 将文件复制到目录中,对文件进行分析,然后删除文件。
我想遍历一组作业并使用生成器暂停执行,直到该批处理作业完成,然后再开始另一个作业。这是我目前所拥有的:
const cars = ["toyota", "honda", "acura"];
function copyFilesAndRunAnalysis(car) {
return new Promise(function(resolve, reject) {
setTimeout(function() { // simulate some delay
resolve(); // control should return to generator here
}, 1000);
});
}
function* doCar(car) {
yield copyFilesAndRunAnalysis(car);
}
// BEGIN HERE
console.log('start here');
carBatch = doCar(cars[0]);
carBatch.next(); // confusion here!!!
carBatch.next(); // should this all be in a forEach loop?
我想做的是有一个循环遍历每辆车的 forEach,在 copyFilesAndRunAnalysis 方法中完成所有相应的工作——暂停到 Promise.resolve() 然后继续下一个。尝试 forEach 根本不会运行任何东西。
【问题讨论】:
-
不确定是否可以使用生成器来执行此操作。生成器不是为处理异步操作而设计的。可观察对象的概念涵盖了您想要做的事情。 Observables 现在在 ES7 命题中。
-
生成器只是同步迭代器的工厂。您必须将它们与 Promise 或 observable 结合起来以处理异步代码。请注意,
Promise只能发出一个值/原因,而生成器能够随着时间的推移发出许多值。有关该主题的更多信息,请访问medium -
查看What happens when promise is yielded in javascript?、ECMA6 generators: yield promise 和Understanding code flow with yield/generators 以找到您所缺少的:异步运行生成器的驱动程序。他们不会自己这样做。
标签: javascript node.js ecmascript-6 generator es6-promise