【发布时间】:2015-06-24 07:11:04
【问题描述】:
我正在babel 的帮助下尝试使用 ES6 生成器,但我无法理解如何(或者如果!)我可以有效地使用基于回调的异步函数来输出迭代器。
假设我希望能够编写一个函数,该函数接受多个 url,异步下载它们并在下载后立即返回它们。 我希望能够编写如下内容:
let urls = ['http://www.google.com', 'http://www.stackoverflow.com' ];
for ( {url, data} of downloadUrls(urls) ) {
console.log("Content of url", url, "is");
console.log(data);
}
如何实现 downloadUrls ?
理想情况下,我希望能够编写以下内容:
var downloadUrls = function*(urls) {
for( let url of urls ) {
$.ajax(url).done( function(data) {
yield data;
});
}
};
这当然行不通,因为 ``yield'' 是在回调内部调用的,而不是直接在生成器内部调用的。 我可以在网上找到许多尝试相同的人的示例,它们要么是 not much transparent),要么是需要 enabling browser/node flags,要么是使用特定于节点的功能/库。 最接近我需要的库似乎是 task.js,但我什至无法在当前 Chrome 上运行最简单的示例。
有没有办法使用标准和当前特性来获得预期的行为,(当前我的意思是可以与 babel 之类的编译器一起使用,但不需要在浏览器上启用额外的标志)还是我必须等待 @987654329 @?
【问题讨论】:
-
这些在线解释对您来说究竟是如何不“透明”的?大卫沃尔什的文章是我读过的最好的文章之一(但你当然需要阅读整个系列)
-
似乎相关:异步生成器提案github.com/jhusain/asyncgenerator(AFAIK 尚不支持)。
标签: javascript asynchronous ecmascript-6 babeljs