首页 > 其他分享 >使用async/await与forEach循环结合

使用async/await与forEach循环结合

时间:2023-10-30 22:24:18浏览次数:32  
标签:files const await forEach async contents

内容来自 DOC https://q.houxu6.top/?s=使用async/await与forEach循环结合

forEach循环中使用async/await是否有问题?我试图遍历一个文件数组,并对每个文件的内容使用await

import fs from 'fs-promise'

async function printFiles() {
  const files = await getFilePaths(); // 假设这没问题

  files.forEach(async (file) => {
    const contents = await fs.readFile(file, 'utf8');
    console.log(contents);
  });
}

printFiles();

这段代码确实可以工作,但这样使用是否有问题呢?我听有人说,像这样的高级函数中不应该使用async/await,所以我只是想知道是否有问题。


当然,这段代码确实可以工作,但我确信它并没有按照你的期望来执行。它只是触发了多个异步调用,但在那之后printFiles函数会立即返回。

按顺序读取

如果你想按顺序读取文件,确实不能使用forEach。只需改用现代的for … of循环即可,在循环中使用await会得到预期的结果:

async function printFiles() {
  const files = await getFilePaths();

  for (const file of files) {
    const contents = await fs.readFile(file, 'utf8');
    console.log(contents);
  }
}

同时读取

如果你想同时读取文件,确实不能使用forEach。每个async回调函数调用都会返回一个promise,但你却将它们丢弃了,而没有等待它们。只需改用map,然后使用Promise.all等待你将获得一个包含所有promise的数组:

async function printFiles() {
  const files = await getFilePaths();

  await Promise.all(files.map(async (file) => {
    const contents = await fs.readFile(file, 'utf8')
    console.log(contents)
  }));
}

标签:files,const,await,forEach,async,contents
From: https://www.cnblogs.com/xiaomandujia/p/17799016.html

相关文章

  • C++多线程——async、packages_task、promise
    异步编程async、future基本概念和使用:异步执行函数:std::async可以异步执行一个函数,这意味着函数将在后台线程中执行,而当前线程可以继续执行其他任务。返回值获取:你可以获得函数的返回值,或者得到一个std::future对象,它允许你在将来的某个时刻获取函数的结果。线程......
  • 1.手写foreach
    我们首先先创建一个index.js的文件在文件中定义一个数组,就像这样letarray=[10,20,30];array.forEach((item)=>console.log(item));使用nodeindex.js运行这段代码,我们可以看到输出的结果是102030现在让我们来实现自己的foreach方法吧letarray=[10,20,30];......
  • 前端多线程处理——async/await
    async从字面上看就是“异步”,它放在函数定义之前,是使该函数在调用时开一个子线程,以不影响主线程的运行。而await经常和async组合使用,在async定义的函数中来等待需要时间运行的代码(如ajax请求、Promise对象)的运行结果,以做后续的处理。  如下面的返回Promise对象......
  • [Compose] Async generator, Promise + generator
    functiongetData(d){setTimeout(()=>{if(typeofd==="number"){run.next(d/2)}else{run.next(d)}},500)}function*gen(){varx=1+(yieldgetData(10))//x=1+5......
  • async await
    async和await是JavaScript中用于处理异步操作的特性,它们使异步代码更易于编写和理解。下面我将详细解释它们,并提供一些示例来说明它们的用法。async函数:async关键字用于定义一个异步函数。异步函数是返回一个Promise对象的函数。在异步函数内部,你可以使用await来等......
  • Flutter开发Don't use 'BuildContext's across async gaps警告
    问题Flutter开发中遇到Don'tuse'BuildContext'sacrossasyncgaps警告有问题的源码if(awaitdatabaseHelper.isDataExist(task.title)){showDialog(context:context,builder:(BuildContextcontext){returnAlertDialog(......
  • C# async await 异步执行方法
    代码如下usingSystem;usingSystem.Threading;usingSystem.Threading.Tasks;namespaceDemo{classProgram{staticvoidMain(string[]args){Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-ddHH:mm:ss&qu......
  • async函数执行机制
    fn()console.log(1);setTimeout(()=>{console.log(4);},100);Promise.resolve().then(()=>{console.log(2);})console.log(3);functionfnPromise(){......
  • async和await
    https://blog.csdn.net/weixin_44228698/article/details/1087447621,await从线程池中获取线程执行。2,await后的代码从线程池中获取线程执行,与1中的线程号可能相同,也可能不同。3,UI线程执行async,await后的代码回到UI线程执行。4,获取返回结果.Result会阻塞当前线程,注意与3造成死......
  • [Compose] Async programming: Thunks
    ThunksSyncthunk:Ablockerofcodewhichhaseverythingreadyandcanreturnthevaluedirectly.functionadd(x,y){returnx+y}constthunk=function(){returnadd(10,15)}thunk()//25Ao thunkisprettymuchthesameasHighorderfunc......