gpt4 book ai didi

javascript - ES6 生成器 : transforming callbacks to iterators

转载 作者:数据小太阳 更新时间:2023-10-29 04:51:06 26 4
gpt4 key购买 nike

我正在 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 这样的转译器一起使用,但不需要在浏览器上启用额外的标志)或者我是否必须等待 异步/等待 ?

最佳答案

2019年更新

通过 回调产生结果实际上非常简单。由于您只能从生成器 function* 中直接调用 yield(而不是从回调中调用),因此您需要 yield 一个 Promise,它将是 从回调中解析d:

async function* fetchUrls(urls) {
for (const url of urls)
yield new Promise((resolve, reject) => {
fetch(url, { mode: 'no-cors' }).then(response => resolve(response.status));
});
}

(async function main() {
const urls = ['https://www.ietf.org/rfc/rfc2616.txt', 'https://www.w3.org/TR/PNG/iso_8859-1.txt'];
// for-await-of syntax
for await (const status of fetchUrls(urls))
console.log(status);
}());

如果该示例在浏览器中不起作用(由于 Cross Origin Read Blocking ,我返回 0 而不是 200),请在 repl.it 上运行它.

关于javascript - ES6 生成器 : transforming callbacks to iterators,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29699109/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com