nodejs 实现方法返回值常见方式

news/2024/10/22 8:36:50/

1、使用回调函数

        回调函数是一种常见的方式来处理异步操作的结果。定义一个函数,并将回调函数作为参数传递给该函数。在异步操作完成后,调用回调函数并传递结果作为参数。

function asyncFunction(callback) {// 异步操作...// 完成后调用回调函数callback(null, result);
}asyncFunction(function(err, result) {if (err) {// 处理错误} else {// 处理结果}
});

2、使用 Promise 对象

        Promise 提供了一种更简洁的方式来处理异步操作的结果。在函数中返回一个 Promise 对象,并在异步操作完成后使用 resolve 方法传递结果、reject 方法传递错误。

function asyncFunction() {return new Promise(function(resolve, reject) {// 执行异步操作...const result = 'Hello, World!';resolve(result);});
}asyncFunction().then(function(result) {// 处理结果console.log(result);}).catch(function(error) {// 处理错误console.error(error);});

3、使用 async/await

        async/await 是一种基于 Promise 的语法糖,使异步代码看起来像同步代码。使用 async 关键字将函数标记为异步函数,并使用 await 关键字等待异步操作的结果。

function delay(ms) {return new Promise(function(resolve) {setTimeout(resolve, ms);});
}async function asyncFunction() {await delay(2000);return 'Hello, World!';
}async function main() {try {const result = await asyncFunction();// 处理结果console.log(result);} catch (error) {// 处理错误console.error(error);}
}main();

4、使用事件触发器(EventEmitter)

        Node.js 的核心模块 events 提供了事件触发器的功能,你可以定义自定义事件,并在异步操作完成后触发事件来返回结果。 

const EventEmitter = require('events');function asyncFunction() {const emitter = new EventEmitter();// 异步操作...// 完成后触发事件并传递结果emitter.emit('done', result);return emitter;
}asyncFunction().on('done', function(result) {// 处理结果
});

 总结对比

优点缺点
回调函数简单易懂、兼容性好

回调地狱:当有多个异步操作需要顺序执行或嵌套时,回调函数的嵌套层级会增加,导致代码难以维护和阅读

错误处理复杂:需要手动处理错误传递,容易出现错误处理不当或遗漏的情况

Promise 对象可读性强、错误处理简便:Promise 内置了错误处理机制,通过 catch 方法可以捕获并处理异常难以取消,无法处理同步异常,链式错误处理不方便,可能导致过多的嵌套
async/await同步风格(基于 Promise)、异常处理简单

无法处理并行:async/await 本质上是顺序执行异步操作,无法直接处理多个并行的异步任务

事件触发器(EventEmitter)适用性广泛、灵活性高,适合处理多个异步任务并行执行的情况

使用复杂:需要熟悉事件的概念和事件驱动编程的思维模式

可读性较差:件触发器的代码结构不便于阅读


http://www.ppmy.cn/news/1372499.html

相关文章

数仓开发-面试二

1.finebi使用 2.数据抽取中间件 flink,kettle flink和kettle区别 3.flink本身的优点和缺点 4.flink容错机制 5.DS 6.数据库 7.主要找orcle、clickhourse 8.mysql离线查作业执行计划,如,你写个sql500,这个时候你怎么定位问题,查看问…

【Unity】使用ScriptableObject存储数据

1.为什么要用ScriptableObject? 在游戏开发中,有大量的配置数据需要存储,这个时候就需要ScriptableObject来存储数据了。 很多人会说我可以用json、xml、txt,excel等等 但是你们有没有想过,假设你使用的是json&#x…

稀碎从零算法笔记Day9-LeetCode:最长公共前缀

题型:字符串 链接:14. 最长公共前缀 - 力扣(LeetCode) 来源:LeetCode 题目描述(红字为笔者添加) 编写一个函数来查找字符串数组中的最长公共前缀(前X个字母相同)。 如果不存在公共前缀&…

html实体字符,看完这篇彻底明白了

二.技术基础知识 基础知识一直都是重点考察的内容,包含有HTML(5)、CSS(3)、JavaScript到 戳这里领取完整开源项目:【一线大厂前端面试题解析核心总结学习笔记Web真实项目实战最新讲解视频】 Vue&#xff0…

【操作系统】中断、驱动程序与 signal 处理函数

中断是 cpu 与外设打交道的重要方式。计算机有多重多样的外设,例如:键盘、鼠标、硬盘、显示器等。除了 cpu 向这些外设传输数据外,这些设备也会向 cpu 传输数据。学习后发现,中断的理解与驱动程序的理解关系密切。并且中断与信号处…

FreeRTOS是什么语言开发的?FreeRTOS是MCU还是SOC的开发系统?和Linux、Android系统有什么区别?

FreeRTOS主要是用C语言开发的。为了确保代码的可读性、可移植性和易于维护,大部分的代码都是以C语言编写。此外,FreeRTOS中也包含了一些汇编语言编写的部分,这些通常用于特定于体系结构的内核调度函数。这种设计使得FreeRTOS能够在多种不同的…

ubuntu个人系统软件安装配置备忘

1. 替换软件源 /etc/apt/source.list 2. 安装必要软件 安装基础软件 sudo apt update sudo apt install -y python3-pip git vim curl wget clang clang-format flameshot docker升级pip3 python3 -m pip install --upgrade pip 安装google浏览器 https://deb.pkgs.org/…

深入理解Docker

文章目录 1 Docker理论1.1 背景知识1.2 是什么1.3 Docker基本三要素1.4 镜像原理1.5 安装教程 2 Docker常用命令2.0 防火墙相关命令2.1 镜像命令2.2 容器命令2.3 进阶命令 3. 实战之Docker部署springboot项目步骤一:Springboot项目配置1.1 添加docker的maven依赖1.2…