JavaScript中确保Generator函数异步代码顺序执行的方法

在 JavaScript 中,Generator 函数可以用于编写异步代码,并且通过 yield
关键字可以暂停和恢复函数的执行。为了确保 Generator 中的异步代码按顺序执行完毕,可以使用 async/await
结合 for...of
循环或者手动调用 next()
方法来实现。
方法一:使用 for...of
循环和 async/await
async function runGenerator(generator) {
for (const value of generator) {
await value; // 等待每个 yield 返回的 Promise 完成
}
}
function* myGenerator() {
yield new Promise(resolve => setTimeout(() => resolve('Task 1'), 1000));
yield new Promise(resolve => setTimeout(() => resolve('Task 2'), 500));
yield new Promise(resolve => setTimeout(() => resolve('Task 3'), 200));
}
runGenerator(myGenerator()).then(() => {
console.log('All tasks completed');
});
方法二:手动调用 next()
方法
function runGenerator(generator) {
const iterator = generator();
function step(value) {
const result = iterator.next(value);
if (result.done) {
return Promise.resolve(result.value);
}
return Promise.resolve(result.value).then(step);
}
return step();
}
function* myGenerator() {
const result1 = yield new Promise(resolve => setTimeout(() => resolve('Task 1'), 1000));
console.log(result1);
const result2 = yield new Promise(resolve => setTimeout(() => resolve('Task 2'), 500));
console.log(result2);
const result3 = yield new Promise(resolve => setTimeout(() => resolve('Task 3'), 200));
console.log(result3);
}
runGenerator(myGenerator).then(() => {
console.log('All tasks completed');
});
方法三:使用 co
库
co
是一个流行的库,专门用于自动执行 Generator 函数中的异步代码。
const co = require('co');
function* myGenerator() {
const result1 = yield new Promise(resolve => setTimeout(() => resolve('Task 1'), 1000));
console.log(result1);
const result2 = yield new Promise(resolve => setTimeout(() => resolve('Task 2'), 500));
console.log(result2);
const result3 = yield new Promise(resolve => setTimeout(() => resolve('Task 3'), 200));
console.log(result3);
}
co(myGenerator).then(() => {
console.log('All tasks completed');
});
总结
- 方法一 使用
for...of
循环和async/await
,适合简单的场景。 - 方法二 手动调用
next()
方法,适合需要更精细控制的场景。 - 方法三 使用
co
库,适合需要简化代码的场景。
选择哪种方法取决于具体的需求和代码复杂度。