以下是一个简单的例子,演示了 Generator 函数在异步应用中的用法:
function fetchData(url) {
// 模拟异步操作,返回一个 Promise 对象
return new Promise((resolve, reject) => {
setTimeout(() => {
// 模拟异步请求成功
resolve(`Data from ${url}`);
}, 1000);
});
}
function* asyncGenerator() {
try {
const result1 = yield fetchData('url1');
console.log(result1); // 输出: Data from url1
const result2 = yield fetchData('url2');
console.log(result2); // 输出: Data from url2
// 其他异步操作...
} catch (error) {
console.error('Error:', error);
}
}
// 执行异步 Generator 函数
function runAsyncGenerator(generator) {
const iterator = generator();
function handleNext(result) {
const { value, done } = iterator.next(result);
if (done) {
return;
}
// 处理 Promise 对象
if (value instanceof Promise) {
value.then(
(resolvedValue) => handleNext(resolvedValue),
(error) => iterator.throw(error)
);
} else {
// 处理其他值
handleNext(value);
}
}
handleNext();
}
// 运行异步 Generator 函数
runAsyncGenerator(asyncGenerator);
在上述例子中,fetchData 函数返回一个 Promise 对象,模拟异步操作。asyncGenerator 是一个 Generator 函数,通过 yield 暂停执行,并在每次异步操作完成后通过 iterator.next() 恢复执行。runAsyncGenerator 函数用于启动异步 Generator 函数,并处理每次 yield 操作返回的 Promise 对象。
这种结合 Generator 函数和异步操作的方式,使得异步代码看起来更像同步代码,提高了可读性和可维护性。此外,这也为后续的异步流程控制提供了更灵活的可能性。
转载请注明出处:http://www.zyzy.cn/article/detail/4679/ES6