nodeJS中的异步编程

nodejs 不是单线程 在博客项目中关于异步问题:

1.当用户添加一条博客时 需要通过post方式向服务器发送数据 后台获取用户以post方式拿到传送过来的数据 然后存入数据库:

在这里插入图片描述

上面的代码:创建一个空字符串 当用户向服务器发送请求时出发data事件将依次获取来数据进行拼接 当用户请求结束后出发end事件 将拼接后的字符串赋值给req.postData属性 理想中的代码执行顺序如下:

在这里插入图片描述

但是代码中的data和end事件 都是属于异步 SO 真正执行如下:

在这里插入图片描述

因为同步代码优先执行 异步代码等同步代码之行结束后再根据规则执行 这就造成后台接收不到传送的数据
使用Promise解决异步问题:将异步代码放入Promise中 将要传送的数据放到resolve方法中作为参数

在这里插入图片描述

当上面代码执行完成后才执行下面的then里面的代码 同时也回想resolve中的参数传到下面的形参result中 在将其赋值给req.postData 将后续代码放在then中

在这里插入图片描述

2.当nodeJS操作数据库时也存在异步:
var mysql = require('mysql');
var connection = mysql.createConnection({host: 'localhost',user: 'root',password: 'root',database: 'nodeblog'
});//开始连接
connection.connect();//查询所有数据
let sql = 'SELECT * FROM student'
connection.query(sql, (err, result) => {if (err) {console.log('sorry');return;}console.log(result);
});console.log('查询结束')
上面代码的执行结果为:

在这里插入图片描述

说明:虽然查询学生表的代码书写在前 但是优先输出“查询结束”可见后续代码不会等到查询学生表代码执行结束后才执行
解决方法:也是通过Promise

在这里插入图片描述

红色框内为异步代码 黄色框内为后续代码!!!
3.使用Promise实现依次读取文件:
/**依次读取文件*///拿到abc三个文件的路径 使用绝对路径
const path = require('path')
const fs = require('fs')
let a = path.join(__dirname, '文件', 'a.txt')
let b = path.join(__dirname, '文件', 'b.txt')
let c = path.join(__dirname, '文件', 'c.txt')let read = path => {return new Promise((resolve, reject) => {fs.readFile(path, 'utf8', (err,data) => {resolve(data)})})
}read(a).then(data => {console.log(data)return read(b)
}).then(data => {console.log(data)return read(c)
}).then(data => {console.log(data) 
})

OK

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/248789.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nodeJs 操作数据库

首先在node中下载mysql包 npm install mysql 连接数据库 var mysql require(mysql); var con mysql.createConnection({host : localhost,user : root,password : root,database : blog });开启链接 con.connect();执行增删改查 不同功能创建不同的sql语句即可…

总结面试题——Javascript

文章目录1.闭包2.作用域链3.JavaScript的原型 原型链 有什么特点4.事件代理5.Javascript如何实现继承6.this对象7.事件模型8.new操作符9.ajax原理10.解决跨域问题11.模块化开发怎么做12.异步加载js的方式有哪些13.会造成内存泄漏的操作14.XML和JSON的区别15.webpack16.AMD和Com…

OAuth2.0 知多少

OAuth2.0 知多少 原文:OAuth2.0 知多少1. 引言 周末逛简书,看了一篇写的极好的文章,点击大红心点赞,就直接给我跳转到登录界面了,原来点赞是需要登录的。 可是没有我并没有简书账号,一直使用的QQ的集成登录。下面有一排…

五分钟带你摸透 Vue组件及组件通讯

一.组件化开发 组件 (Component) 是 Vue.js 强大的功能之一。组件可以扩展 HTML 元素,封装可重用的代 码。在较高层面上,组件是自定义元素,Vue.js 的编译器为它添加特殊功能。在vue中都是组件化开发的,组件化开发就是把一个完整的…

微信公众号开发-接入

一 首先实现内网穿透,公众号需要连接我们的服务器,内外无法访问,所以先实现自己的内网可以测试时连接外网,下载natapp,选择windows,顺便下载config,ini 配置文件。注册好购买免费的隧道 然后将token写入配置…

Vue 项目上线优化

上线项目的优化 优化上线项目,首先在上线打包时我们通过babel插件将console清除,当然对项目打包后的体积的影响是微乎其微,对项目的入口文件的改善也是很有必要的,因为在开发阶段和上线如果我们使用的是同一入口文件,…

Python并发编程—进程

多任务编程 1.意义: 充分利用计算机多核资源,提高程序的运行效率。 2.实现方案 :多进程 , 多线程 3.并行与并发 并发 : 同时处理多个任务,内核在任务间不断的切换达到好像多个任务被同时执行的效果&#xf…

Vue 脚手架中的.eslintrc.js代码规范 的解决

在我们使用Vue脚手架 创建项目时 尤其是团队共同开发项目时 会按照一个共同的代码规范来编程 创建Vue脚手架中有一个.eslintrc.js格式 但是在编程中我们通常会使用 shiftaltf 进行代码格式化 但是由于格式化后的代码 与Vue中的.eslintrc规范不协调 尤其是 “” ; 以…

前端面试---Vue部分考点梳理

一. Vue的使用 1. Vue的基本使用 指令 插值 插值 表达式 指令 动态属性 v-html 会有XSS风险 会覆盖子组件 computed 和 watch computed 有缓存 data不变则不会重新计算watch 如何深度监听watch 监听引用类型时 拿不到oldVal v-for v-for 和 v-if 不能同时使用:key的值尽量…

.net core实现跨域

什么是跨域在前面已经讲解过了,这里便不再讲解,直接上代码。 一、后台API接口 用.net core创建一个Web API项目负责给前端界面提供数据。 二、前端界面 建立两个MVC项目,模拟不同的ip,在view里面添加按钮调用WEB API提供的接口进行…

TCP/IP简介

TCP/IP简介 OSI的“实现”:TCP/IP参考模型 并不完全符合OSI的七层参考模型,但我们可以理解为OSI的一种实现 TCP/IP协议简述 在很多情况下,它只是利用IP协议进行通信时,所必须用到的协议群的统称,具体来说,I…

Spring-Cloud 学习笔记-(4)负载均衡器Ribbon

目录 Spring-Cloud 学习笔记-(4)负载均衡器Ribbon1、前言2、什么是负载均衡2.1、问题分析2.2、什么是Ribbon3、快速入门3.1、实现方式一3.1.1、修改代码3.2、实现方式二3.2.1、启动类3.2.2、调用代码3.2.3、测试3.2.4、实现原理3.2.5、断点调式3.3、修改…

‘仿微信发表朋友圈’项目中登录功能的业务逻辑

登录功能 手机号验证码都通过后端验证后 返回用户数据 登陆成功 成功后 调用store中的setUser方法 store中的setUser方法 将后端返回的用户信息存储到localStorage中 同时登录成功后服务器会将token自动存入我们的cookie中 有过期时间 在我们请求需要登录的接口时将cookie中的…

kubernetes--配置文件

转载于:https://www.cnblogs.com/caiciadeliliang/p/10993388.html

微信动态中的背景图更换

初衷: 图一中的红框中的部分,作为用户自定义的背景图,如果用户没有上传也会为其自动设置一张背景图,当用户点击时则会出现图二中的选项 ,点击取消则选项消失,点击从相册选择则会跳转本机的相册&#xff0c…

大数据学习——akka自定义RPC

实现 package cn.itcast.akkaimport akka.actor.{Actor, ActorSystem, Props} import akka.actor.Actor.Receive import com.typesafe.config.ConfigFactoryimport scala.collection.mutableimport scala.concurrent.duration._class Master(val host: String, val port: Int) …

从Client应用场景介绍IdentityServer4(一)

从Client应用场景介绍IdentityServer4(一) 原文:从Client应用场景介绍IdentityServer4(一)一、背景 IdentityServer4的介绍将不再叙述,百度下可以找到,且官网的快速入门例子也有翻译的版本。这里主要从Clie…

开发常用代码笔记

Vue 使用moment插件对时间进行格式化(全局设置) 下载插件 npm install moment --save 在main.js中引入插件 import moment from ‘moment’ 在main.js中定义全局过滤器 Vue.filter(dataFilter,function (dataStr,patten YYYY-MM-DD HH:mm:ss) {retur…

微信小程序——账号及开发工具

1. 注册微信小程序账号 点击我进入微信公众平台 进入后点击立即注册 注册成功且登录后进入小程序管理后台 2. 安装开发者工具 点击进入开发文档 进入安装开发工具(稳定版本) 一路默认下一步进行安装 3. 开发者工具的使用 使用注册微信小程序的微信号…

CSS注意的地方

content-box和border-box的区别 2018年02月27日 22:20:16 sulingliang 阅读数:8011盒子模型 盒子宽度:paddingbordercontent-width 盒子高度:paddingbordercontent-height 如图所示 盒子模型content-box 说明:在内容宽度和高度之…