Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用AsyncIterable with next()样式而不是for Wait循环_Javascript_Deno - Fatal编程技术网

Javascript 使用AsyncIterable with next()样式而不是for Wait循环

Javascript 使用AsyncIterable with next()样式而不是for Wait循环,javascript,deno,Javascript,Deno,让我在这个问题的前面加上一条注释,我用deno和javascript标记这个问题,因为我仍然在关注生成器函数、迭代器和其他一些较新的异步JS特性,所以我不确定这是否是deno API或javascript的一个更大的问题 因此,Deno.readDir()返回一个AsyncIterable,我看到的所有示例都使用for wait循环处理结果,如下所示: for await (const dirEntry of Deno.readDir("/")) { console.lo

让我在这个问题的前面加上一条注释,我用deno和javascript标记这个问题,因为我仍然在关注生成器函数、迭代器和其他一些较新的异步JS特性,所以我不确定这是否是deno API或javascript的一个更大的问题

因此,
Deno.readDir()
返回一个AsyncIterable,我看到的所有示例都使用for wait循环处理结果,如下所示:

for await (const dirEntry of Deno.readDir("/")) {
  console.log(dirEntry.name);
}
For await循环不适合我的用例,因为我需要用另一个异步循环交错遍历目录。我宁愿使用类似于
let reader=Deno.readDir(“/”)的东西
然后在我的另一个异步代码中,调用类似于
let nextdir=wait reader.next()的东西根据需要

我不能这样做,因为
Deno的结果。readDir(“/”
没有实现
next()

经过反复试验、猜测和在阳光下尝试一切,我能够使它像这样工作:

   let reader = Deno.readDir(source);
   let readeriter = reader[Symbol.asyncIterator](); // <-- the weird part

   // other code here between...

   let nextdir = await readeriter.next(); // works!
     
let reader=Deno.readDir(源代码);

让readeriter=reader[Symbol.asyncierator]();//“AsyncIterable显然是要迭代的东西”-与迭代器(实现
.next()
本身)的区别在于它可以通过调用
const reader2=reader[Symbol.asyncIterator]()进行多次迭代再次。你也看到了,也看到了,不,这是协议应该如何工作的——在我看来也不难看。如果您想要一个好的语法,请使用
for await…of
:-)不值得一个完整的答案,但您可以像
Deno.readDir(“/foo”)[Symbol.asyncierator]()那样内联它以避免中间变量,但不幸的是,这是将Iterable转换为迭代器的规范方法。由于
Deno.readDir
是一个稳定的api,它不太可能在将来改变——您可以尝试打开一个问题,如果您提供了一个好的案例,它可能会被标记为2.0,但这是一个漫长的过程shot@Bergi好的,谢谢你的解释和链接,它们非常有用,我想我已经开始“理解”了。可以理解的是,可能需要多次遍历一个iterable,在这种情况下,需要从iterable创建多个迭代器。很高兴知道它是如何被创造出来的,丑陋与否:)@WilliamPerron,谢谢。我不认为我现在有资格对API应该是什么发表意见,我会接受它是什么:)也许Deno docs中的示例代码可以扩展,包括关于[Symbol.asyncierator]()的说明,因为它是一个核心函数,很多来自Node.js的人可能不熟悉它。