node同步异步:三种解决回调地狱的方式

三种解决异步回调的方法 带你逃离回调地狱 回调地狱 因为Javascript的异步特性,每个开发者都无法避免会碰到一些callback hell,同时在代码的迭代过程当中因为这样一些callback hell导致代码越来越不可维护。尤其是当回调过程中去参杂一些同步逻辑判断,那都是迭代过程中的代码杀手。 基于ES6的promise Promise有三种状态:pending/reslove/reject 。pending就是未决,resol... 阅读详情

1.promisify

Promise 是一个构造函数,可以 new Promise() 得到一个 Promise 的实例;

  1. 在 Promise 上,有两个函数,分别叫做 resolve(成功后的回调函数) 和 reject(失败后的回调函数)
  2. 在 Promise 构造函数的 Prototype 属性上,有一个 .then() 方法,也就是说,只要是 Promise
    构造函数创建的实例,都可以访问到 .then() 方法
  3. Promise 表示一个异步操作;每当我们 new 一个 Promise 的实例,这个实例,就表示一个具体的异步操作;
  4. 既然 Promise 创建的实例,是一个异步操作,那么这个异步操作的结果,只能有两种状态:
  5. 状态1:异步执行成功了,需要在内部调用 成功的回调函数 resolve 把结果返回给调用者; 状态2:异步执行失败了,需要在内部调用失败的回调函数 reject 把结果返回给调用者;
  6. 由于 Promise 的实例,是一个异步操作,所以,内部拿到操作的结果后,无法使用 return
    把操作结果返回给调用者;这时候,只能使用回调函数的形式,来把成功或失败的结果,返回给调用者;
  7. 可以在 new 出来的 Promise 实例上,调用 .then() 方法,【预先】为这个 Promise 异步操作,指定
    成功(resolve) 和 失败(reject) 回调函数;

/await关键字
1.它只能出现在异步函数中
2.await promise 它可以暂停异步函数的执行 等待promise对象返回结果后再向下执行函数

``示例如下

var p1 = new Promise(function (resolve, reject) {
    fs.readFile('./1.txt', 'utf-8', function (err, data) {
        if (err) {
            // console.log(err);
            reject(err);// 把容器的 Pending 状态变为 Rejected
        } else {
            // console.log(data);
            resolve(data);// 把容器的 Pending 状态变为 Resolved
        }
    })
});

var p2 = new Promise(function (resolve, reject) {
    fs.readFile('./2.txt', 'utf-8', function (err, data) {
        if (err) {
            reject(err);
        } else {
            resolve(data);
        }
    })
});

var p3 = new Promise(function (resolve, reject) {
    fs.readFile('./3.txt', 'utf-8', function (err, data) {
        if (err) {
            reject(err);
        } else {
            resolve(data);
        }
    })
});

// 读取成功调用 then 的第一个参数,即状态 Rejected
// 读取失败调用 then 的第二个参数,即状态 Resolved
p1
    .then(function (data) {
        console.log(data);
        return p2;
    }, function (err) {
        console.log(err);
    })
    .then(function (data) {
        console.log(data);
        return p3;
    })
    .then(function (data) {
        console.log(data);
    });
    .catch(err => {
        console.log('err:' + err)
	})

2.async/await

1.在普通函数定义的前面加上async关键字 普通函数就变成了异步函数
2.异步函数默认的返回值是promise对象
3.在异步函数内部使用throw关键字进行错误的抛出
await关键字
// 1.它只能出现在异步函数中
// 2.await promise 它可以暂停异步函数的执行 等待promise对象返回结果后再向下执行函数

async function p1 () {
	return 'p1';
}

async function p2 () {
	return 'p2';
}

async function p3 () {
	return 'p3';
}

async function run () {
	let r1 = await p1()
	let r2 = await p2()
	let r3 = await p3()
	console.log(r1)
	console.log(r2)
	console.log(r3)
}

run();

3.generator

Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同

特征:

  1. function 命令与函数名之间有一个星号
  2. 函数体内部使用 yield 语句定义不同的内部状态
    yield 表达式
    . Generator 函数内部提供了一种可以暂停执行的函数,yield 语句就是暂停标志

遍历器对象的 next 方法的运行逻辑如下:

  1. 遇到 yield 语句就是暂停执行后面的操作,并将紧跟在 yield 后的表达式的值作为返回的对象的 value 值
  2. 下次调用 next 方法继续向下执行后面的 yield 语句 直到 return 为止,将 return 的值赋值给 value,若无
    return 后面的值 value 都为 undefined,此时 done 值为 true,for of 遍历停止

注意:yield 表达式只能用在 Generator 函数里面,用在其他地方都会报错

function* helloWorldGenerator() {
  yield 'hello';
  yield 'world';
  return 'ending';
}

var hw = helloWorldGenerator();
Node.js中异步回调地狱的报错与优化 Node.js异步回调地狱问题分析与优化方案 本文系统分析了Node.js中回调地狱的三大典型问题:多层嵌套导致代码不可读、错误传播失控、并发控制困难。通过具体代码示例展示了传统回调方式存在的问题,并提出三种优化方案:1) Promise链式调用,实现扁平化代码结构;2) async/await语法糖,简化异步流程控制;3) 第三方async库处理复杂并发场景。文章对比了不同方案的性能特点,建议根据场景复杂度选择合适方案,并提供了文件处理系统的优化案例,从回调版本到async/await版本的完整改造过程。 阅读详情

相关推荐

ES6之Promise解决回调地狱

目录回调函数:回调地狱:Promise介绍:Promise解决回调地狱: 回调函数:         在一个函数里面以形参的方式调用一个传递进来的函数。 例如: function a(callback){ callback(); } a(function(){ }) 回调地狱:         回调函数套用过多。 前端的ajax和jsonp内部充斥着大量的异步,为了能够拿到异步的数据,使用了大量的回调函数,来获取将来异步执行成功之后的数据。         从一定程度上来说,回调地狱能解决问题,但是有缺点,或者说不优雅,阅读性非常差。 例如: var sayhello = function

用 ES6 解决你的回调地狱

用 ES6 解决你的回调地狱 最近系统的学了一下 ES6,发现以往编码的项目还有很多可以改进的空间,所以我使用 ES6 对部分过去的项目进行重构 Promise 这是之前用 node.js 写的一个接口,查询作者信息和当前用户的关系,基本思路是 查询粉丝和博主的关系(关注,未关注) 查询博主的所有粉丝 里面有一个 connection 查询是很明显的回调地狱,让我们用 Promise 解决掉它 app.get("/authorInfo", function (req, res) { const fa

bigPatrickstar的博客 1426

从ADS到Origin:高效绘制负载牵引Smith圆图的完整指南

本文提供了一份从ADS导出负载牵引数据并在Origin中绘制专业Smith圆图的完整指南。详细介绍了数据导出、导入、关键的数据解释步骤,以及高效处理多组曲线的技巧,帮助射频工程师快速生成用于报告和论文的出版级图表。

tgb3456789的博客 1135

ES6 生成器函数实例 解决回调地狱问题

ES6 生成器函数实例 解决回调地狱问题。

m0_64436820的博客 202

库存预测新思路:AI架构师的图神经网络应用

用图神经网络(GNN)解决传统库存预测的“关联盲区”,让预测从“孤立商品”转向“商品网络”。传统库存预测的痛点分析;GNN的核心概念(图结构、消息传递);GNN在库存预测中的算法原理与代码实战;实际应用场景与未来趋势。背景:用超市老板的烦恼引出传统方法的问题;核心概念:用“商品朋友圈”比喻GNN的图结构和消息传递;算法原理:用数学公式和Mermaid流程图讲清楚GNN的工作流程;实战:用PyTorch Geometric写一个简单的库存预测模型;

AI Python 编程之道的博客 959

kali破解WIFI密码

今天我们来学习一下通过kali和一个好的字典来破解WIFI密码。 声明:此教程仅供学习研究使用,严禁使用此技术进行非法行为 首先我们需要一个具有监听功能的无线网卡(这里我给大家推荐:rt3070) 本章实验通过虚拟机VMware进行: 先通过services.msc来打开VMware USB Arbitration Service 插上监听网卡,连接USB到虚...

#的博客 5808

es6——promise(解决回调地狱的问题)

首先,提出一个需求:要封装一个方法,使得能够读取文件,并将内容返回 先创建 3个 .txt 文件1.txt/2.txt/3.txt,作为我们要读取的文件,内容自己瞎编 fs 和 path 模块: const fs = require('fs'); const path = require('path'); 这是普通读取文件的方式: fs.readFile(path.join(__dirn...

肖的博客 1511

postgresql 数据库 timescaledb 函数time_bucket_gapfill()报错解决及更换 license

最近在工作中使用postgresql 和 timescaledb 的time_bucket_gapfill()函数 报错,让更换license,在网上找了一大圈,没有找到,最后解决了这个问题,这篇文章记录我的解决办法查看timescaledb.license参数命令:show timescaledb.license;修改命令: 结果不行,报错如下:lter system set timescaledb.license=‘timescale’;那只能换包了如果出现上面那种情况,那我们只能先从官网上下载带 '

yang_z_1的博客 3249

ES6 Promise async await 解决回调地狱

Promise 解决回调地狱 参考视频 什么是回调地狱? 需要控制异步函数的执行顺序,而将他们层层嵌套,使得代码结构复杂,难以维护。 Promise 如何解决 new Promise(function(resolve) { //写异步方法,下例 setTimeout(() => { resolve("要传递的数据"); // 执行此语句时 .then方法会执行 通过回调函数拿到数据 }, 500) }).then((data) => { // 这里就相当于把异步要执行的内容拿出来,放

海胆的博客 381

基于YOLOv10的机器人抓取引导系统:从物体检测到精准抓取

python# 数据标注工具简化版import os"""启动标注工具""""""标注单张图像"""print(f"标注图像: {os.path.basename(img_path)}")print("请在图像上绘制抓取矩形框...")# 这里应该实现交互式标注界面# 简化版本直接返回示例标注# 示例标注数据"""保存标注结果"""# 保存为YOLO格式# 转换为YOLO格式。

YOLO 377

C语言程序设计——单词的统计和替换

【任务描述】 对任意一篇英文文章,统计其中每个单词分别出现了多少次,并可替换指定的单词。⑶ 对单词进行替换时,允许用户选择全部替换或逐个替换。替换完成后,将文章保存到文件。⑴ 英文文章以文件形式输入。⑵ 统计的结果保存到文件。

m0_60738889的博客 810

带你了解ES6的【Promise】及如何解决回调地狱 和 【async】【await】的使用

所谓promise,简单来讲他就是一个盒子,里边保存这未来才会结束的一个事件(一般是一个异步操作)。 Promise盒子中有三个状态:pending(准备状态)、fulfilled(成功状态)、rejected(失败状态) Promise中可以有两个方法:resolve() 、 reject(),改变三个状态: pending->fulfilled => resolve() pending->rejected => reject() 并且,当改变发生之后,状态就会定型,后续通过方法

Lan_0316的博客 2625

完整的 Python 数据分析案例:新能源汽车续航里程预测

随着新能源汽车的普及,续航里程成为消费者关注的重要指标。准确预测新能源汽车的续航里程,有助于车企优化电池管理系统、提升车辆性能,也能帮助消费者合理规划出行。本案例将基于新能源汽车的各项参数,如电池容量、行驶速度、环境温度等,构建续航里程预测模型。通过以上改进,可以提高数据处理的准确性、模型的性能和可视化的效果。

daqsdfas的博客 1587

NODEJS Fs模块的一些笔记

fs 读取文件的方式 同步 fs.readFileSync(“path”,“utf-8”) 异步 fs.readFile(path,‘utf-8’,(err,data)=>{}) 流 fs.createReadStream(path) rs.on("data",(thunk)=>{ } rs.on("end",callback) Promise可以解决"...

Rit3971054的博客 277

二、Windows安装Docker到非C盘的全新教程(Windows版)

Windows安装Docker到非C盘的全新教程(Windows版)

funfan的博客 4万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

异步 Javascript:Node Js 回调地狱

Javascript 是一种同步和单线程编程语言,但由于其异步性质,javascript 中的某些任务可以并行运行。在 javascript 中,通过使用 Callback 函数,我们可以执行异步任务。回调看似容易实现,但可能导致回调地狱的问题,使代码无法读取和维护。尽管可以通过多种方式轻松避免Node.js中的回调地狱;其中一些正在使用 async/await 和 Promises。回调函数是一个简单的 javascript 函数,它作为参数传递给另一个函数,并在另一个函数完成执行时执行。

新华编程特战队 2321

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

38.JavaScript中异步与回调的基本概念,以及回调地狱现象

在学习本文内容之前,我们必须要先了解异步的概念,首先要强调的是异步和并行有着本质的区别。并行,一般指并行计算,是说同一时刻有多条指令同时被执行,这些指令可能执行于同一的多核上,或者多个上,或者多个物理主机甚至多个网络中。同步,一般指按照预定的顺序依次执行任务,只有当上一个任务完成后,才开始执行下一个任务。异步,与同步相对应,异步指的是让暂时搁置当前任务,先处理下一个任务,当收到上个任务的回调通知后,再返回上个任务继续执行,整个过程无需第二个线程参与。也许用图片的方式解释并行、同步和异步更为直观,假设现在有A

魏大大 3005

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

什么叫做回调地狱

先来看一个小例子 var fs = require('fs') fs.readFile('./src/a.txt', 'utf-8', function(err, data) { if (err) { throw err } console.log(data) }) fs.readFile('./src/b.txt', 'utf-8', function(err, data) { if (err) { throw err }

grand_brol的博客 1万+

node.js 回调函数与解决回调地狱的方法

node.js 回调函数与解决回调地狱的方法

2401_83194362的博客 912

什么是回调地狱?如何解决回调地狱

什么是回调地狱?该如何解决回调地狱?

小hu同学 2987

回调函数是同步还是异步_异步处理:回调函数与promise

前置知识回调可以是同步也可以是异步,异步必须放在回调里执行,也就是对于一个异步任务只有回调函数里的才是异步的,比如:<ul> <li class="one">one</li> <li class="two">two</li> <li class="three">three</li> </ul&gt...

weixin_39710041的博客 3397

Node.js中的回调地狱

Node.js中的回调地狱

商务合作欢迎私信我 3268

什么是回调地狱

回调函数与异步执行模型回调地狱的典型场景与代码剖析使用 Promise 扁平化异步流程async/await:同步语法书写异步逻辑实际开发中的工程化实践与技巧错误处理策略与资源管理在现代 Web 前端知识开发中,异步编程是处理耗时操作(如网络请求、文件读取、定时任务等)的核心机制。JavaScript 作为单线程语言,通过事件循环(Event Loop)和异步回调(Callback)模型实现了非阻塞 I/O 操作。

一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身"农奴"把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟! 1142

Node.js回调地狱+解决回调地狱

Node.js中的"回调地狱"指多层嵌套回调导致的代码可读性差、维护困难的问题,常见于顺序执行的异步操作。典型表现为"金字塔"式代码结构,错误处理重复且逻辑割裂。 解决方案包括: Promise链式调用:通过then()方法实现异步流程的线性排列,统一错误捕获 async/await(推荐):使异步代码具有同步书写风格,完全消除嵌套,支持try/catch错误处理 工具库(如Async.js):旧方案通过waterfall等方法组织异步流程 现代开发应优先使用asyn

前端技术的学习整理 592

Nodejs中的回调地狱

然而,随着项目规模的增长,异步操作变得越来越复杂,这往往会导致代码陷入“回调地狱”(Callback Hell)的问题。由于每个操作都需要等待上一个操作的结果,因此形成了深度嵌套的回调结构,这就是所谓的回调地狱。希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。通过Promise,我们将原本嵌套的回调函数转换成了链式调用,不仅使代码更加简洁易读,还提升了错误处理的能力。:将每个异步操作封装成独立的函数或模块,有助于提高代码的可读性和复用性。

一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身"农奴"把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟! 1031

Promise异步函数解决回调地狱

在根目录下创建1.txt、2.txt、3.txt 现在想要依次读取1.txt、2.txt、3.txt文件 要保证是依次读取,所以我们需要回调函数嵌套来保证是依次读取1.txt、2.txt、3.txt文件 const fs = require('fs'); fs.readFile('./1.txt', 'utf8', (err, result1) => { console.log(result1); fs.readFile('./2.txt', 'utf8', (err, resul

Var-al 的博客 519
下一篇: node最基础模块
ZhiAng99
博客等级 码龄6年 3粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值