MST

星途 面试题库

面试题:JavaScript在Node编程中如何实现简单的并发处理

在Node.js环境下,描述一下使用`async/await`结合`Promise.all`实现并发处理多个异步任务的基本步骤,并给出一个简单示例,例如并发读取多个文件的内容。
31.4万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

基本步骤

  1. 定义异步任务函数:使用async关键字定义异步函数,函数内部使用await等待Promise的结果。这些异步函数通常会返回Promise,例如读取文件内容的函数readFileAsync
  2. 创建Promise数组:将多个异步任务函数调用(每个调用返回一个Promise)组成一个数组。
  3. 使用Promise.all:将这个Promise数组作为参数传递给Promise.allPromise.all会等待所有的Promise都完成(或有一个Promise被拒绝)。
  4. 处理结果:在async函数中使用await等待Promise.all的结果,得到所有异步任务的结果数组,然后可以对结果进行处理。

示例代码

const fs = require('fs');
const path = require('path');
const { promisify } = require('util');

// 定义异步读取文件的函数
const readFileAsync = promisify(fs.readFile);

async function readFilesConcurrently(filePaths) {
    const promises = filePaths.map(filePath => readFileAsync(path.join(__dirname, filePath), 'utf8'));
    try {
        const results = await Promise.all(promises);
        results.forEach((result, index) => {
            console.log(`File ${filePaths[index]} content:`, result);
        });
        return results;
    } catch (error) {
        console.error('An error occurred:', error);
    }
}

// 调用函数并传入文件路径数组
const filePaths = ['file1.txt', 'file2.txt', 'file3.txt'];
readFilesConcurrently(filePaths);

上述代码中,readFileAsync使用promisifyfs.readFile转换为返回Promise的函数。readFilesConcurrently函数接收一个文件路径数组,创建一个包含所有文件读取Promise的数组,使用Promise.all并发处理这些Promise,并在所有读取操作完成后处理结果。如果有任何一个读取操作失败,Promise.all会被拒绝并进入catch块。