在 ES8 中使用 while 和 do while 简化 async 迭代器的代码

阅读时长 4 分钟读完

在 ES8 中使用 while 和 do while 简化 async 迭代器的代码

引言

在讨论如何使用 while 和 do while 简化 async 迭代器的代码之前,我们先简单介绍一下 async 迭代器和 ES8 的 async/await。

ES8 的 async/await 让异步编程显得更加简单明了,代码只需要写成同步的样子,而不需要一层层的嵌套回调函数。而在使用 async 迭代器的时候,我们需要手动调用 next() 方法,并处理它们的返回值。这样显然增加了代码的复杂度,也让代码更难以维护。

在这篇文章中,我们将为你介绍如何使用 while 和 do while 来简化 async 迭代器的代码,让你的代码变得更加优雅和易于维护。

ES8 中的 while 循环

ES8 新增了支持异步迭代器的 for await...of 循环。但是,它只在简单循环的情况下起作用。在某些情况下,我们需要使用 while 循环来迭代异步数据,这时我们需要额外写一些代码来支持异步迭代器。

来看下面这个例子:

async function* gen() { yield Promise.resolve(1); yield Promise.resolve(2); }

(async () => { for await (const value of gen()) { console.log(value); } })();

这个例子是使用 for await...of 循环来迭代异步数据的。但是如果数据是通过 Promise 链式调用来获取的,for await...of 循环就不能满足我们的需求。此时,我们需要使用 while 循环来手动处理每个 Promise 链中的值。

下面是使用 while 循环实现相同功能的代码:

async function* gen() { yield Promise.resolve(1); yield Promise.resolve(2); }

(async function() { const genInstance = gen(); let value; while ({ value } = await genInstance.next()) { console.log(value); } })();

这里,我们手动调用 next() 方法,使用 while 循环来迭代 async 生成器的值。每次迭代时,我们通过 await 等待 Promise 的解析。然后,我们从返回的对象中提取 value,并使用它打印消息。

ES8 中的 do while 循环

在某些情况下,我们可能需要先初始化一个变量,然后在循环中迭代该变量。这并不是 for 循环所擅长的事情。但是,我们可以使用 do while 循环来解决这个问题。

来看下面这个例子:

const data = ['a', 'b', 'c'];

(async function() { let i = 0; let value; do { value = await Promise.resolve(data[i++]); console.log(value); } while (i < data.length); })();

在这个例子中,我们使用 do while 循环在异步上下文中迭代一个数组。我们使用 await 让 Promise 解析,并在每次循环中打印数组的元素。

总结

在 ES8 中使用 while 和 do while 简化 async 迭代器的代码,可以让你的程序变得更加简单、易于维护。当你需要自己处理 next() 方法的返回值,或者需要在循环之前初始化变量时,使用 while 和 do while 循环就非常有用。

如果你正在使用 async 迭代器,那么尝试使用 while 和 do while 循环,看看能否将代码变得更加优雅。

参考代码

async function* gen() { yield Promise.resolve(1); yield Promise.resolve(2); yield Promise.resolve(3); } (async function () { const genInstance = gen(); let { done, value } = { done: false, value: null }; do { ({ done, value } = await genInstance.next()); if (!done) { console.log(value); } } while (!done); })();

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64dde081f6b2d6eab3928dac

纠错
反馈