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.pswp.cn/news/248789.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/248789.shtml
英文地址,請注明出處:http://en.pswp.cn/news/248789.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

day01筆記

linux基本命令的學習: 1.查看主機名hostname 2.修改主機名hostnamectl set-hostname s16ds 3.linux命令提示符 [roots16ds ~]# # 超級用戶的身份提示符 $ 普通用戶的身份提示符4.修改命令提示符 PS1變量控制 [roots16ds ~]# echo $PS1 [\u\h \W]\$PS1[\u\h \w \t]…

angular 路由

1. vscode編輯器快速新建主路由: ng-router注意修改為 根路由為:‘forRoot()’app-route.module.ts;{ path:,redirectTo:/login,pathMatch:full } 當路由為空的時候,會重定向到/login路由,必須加上pathMatch:full 1 import { Rou…

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語句即可…

shell字體顏色應用

輸出特效格式控制: \033[0m 關閉所有屬性 \033[1m 設置高亮度 \03[4m 下劃線 \033[5m 閃爍 \033[7m 反顯 \033[8m 消隱 \033[30m -- \033[37m 設置前景色 \033[40m -- \033[47m 設置背景色 光標位置等的格式控制: …

Spring Boot 統一結果封裝

ResultVo, 返回結果對象 Data public class ResultVo<T> {private Integer code;private String message;private T data; }ResultVoUtil, 封裝返回結果 public class ResultVoUtil {public static<T> ResultVo<T> sucess(T data) {ResultVo<T> result…

總結面試題——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…

js實現替換指定字符后面的內容(包括指定字符)

href 223d啥啥啥d dds word sss 1233;var indexOf href.indexOf(word);len href.substring(indexOf,href.length);&#xff08;包括指定字符串&#xff09; var newHref href.replace(len,替換內容);轉載于:https://www.cnblogs.com/-lin/p/10172503.html

OAuth2.0 知多少

OAuth2.0 知多少 原文:OAuth2.0 知多少1. 引言 周末逛簡書&#xff0c;看了一篇寫的極好的文章&#xff0c;點擊大紅心點贊&#xff0c;就直接給我跳轉到登錄界面了&#xff0c;原來點贊是需要登錄的。 可是沒有我并沒有簡書賬號&#xff0c;一直使用的QQ的集成登錄。下面有一排…

五分鐘帶你摸透 Vue組件及組件通訊

一.組件化開發 組件 (Component) 是 Vue.js 強大的功能之一。組件可以擴展 HTML 元素&#xff0c;封裝可重用的代 碼。在較高層面上&#xff0c;組件是自定義元素&#xff0c;Vue.js 的編譯器為它添加特殊功能。在vue中都是組件化開發的&#xff0c;組件化開發就是把一個完整的…

Parameter 'userName' not found. Available parameters are [1, 0, param1, param2]

Mapper接口的方法的參數沒有加&#xff1a;Param("xxx")注解&#xff0c;或者是xxx寫不對轉載于:https://www.cnblogs.com/linliquan/p/10987136.html

微信公眾號開發-接入

一 首先實現內網穿透&#xff0c;公眾號需要連接我們的服務器&#xff0c;內外無法訪問&#xff0c;所以先實現自己的內網可以測試時連接外網&#xff0c;下載natapp&#xff0c;選擇windows&#xff0c;順便下載config,ini 配置文件。注冊好購買免費的隧道 然后將token寫入配置…

Vue 項目上線優化

上線項目的優化 優化上線項目&#xff0c;首先在上線打包時我們通過babel插件將console清除&#xff0c;當然對項目打包后的體積的影響是微乎其微&#xff0c;對項目的入口文件的改善也是很有必要的&#xff0c;因為在開發階段和上線如果我們使用的是同一入口文件&#xff0c;…

Python并發編程—進程

多任務編程 1.意義&#xff1a; 充分利用計算機多核資源&#xff0c;提高程序的運行效率。 2.實現方案 &#xff1a;多進程 &#xff0c; 多線程 3.并行與并發 并發 &#xff1a; 同時處理多個任務&#xff0c;內核在任務間不斷的切換達到好像多個任務被同時執行的效果&#xf…

Vue 腳手架中的.eslintrc.js代碼規范 的解決

在我們使用Vue腳手架 創建項目時 尤其是團隊共同開發項目時 會按照一個共同的代碼規范來編程 創建Vue腳手架中有一個.eslintrc.js格式 但是在編程中我們通常會使用 shiftaltf 進行代碼格式化 但是由于格式化后的代碼 與Vue中的.eslintrc規范不協調 尤其是 “” &#xff1b; 以…

innodb_locks_unsafe_for_binlog分析

mysql數據庫中默認的隔離級別為repeat-read. innodb默認使用了next-gap算法&#xff0c;這種算法結合了index-row鎖和gap鎖。正因為這樣的鎖算法&#xff0c;innodb在可重復讀這樣的默認隔離級別上&#xff0c;可以避免幻象的產生。 innodb_locks_unsafe_for_binlog最主要的作用…

emacs的使用方法

emacs的使用方法 emacs配置&#xff1a; 將文件命名為.emacs&#xff0c;把配置敲進去&#xff0c;放在home文件夾 emacs命令行&#xff1a; altx打開命令行 編譯&#xff1a; 在命令行輸入compile&#xff0c;回車&#xff0c;會出現make -k&#xff0c;刪掉它&#xff0c;輸入…

前端面試---Vue部分考點梳理

一. Vue的使用 1. Vue的基本使用 指令 插值 插值 表達式 指令 動態屬性 v-html 會有XSS風險 會覆蓋子組件 computed 和 watch computed 有緩存 data不變則不會重新計算watch 如何深度監聽watch 監聽引用類型時 拿不到oldVal v-for v-for 和 v-if 不能同時使用:key的值盡量…

.net core實現跨域

什么是跨域在前面已經講解過了&#xff0c;這里便不再講解&#xff0c;直接上代碼。 一、后臺API接口 用.net core創建一個Web API項目負責給前端界面提供數據。 二、前端界面 建立兩個MVC項目&#xff0c;模擬不同的ip&#xff0c;在view里面添加按鈕調用WEB API提供的接口進行…

TCP/IP簡介

TCP/IP簡介 OSI的“實現”&#xff1a;TCP/IP參考模型 并不完全符合OSI的七層參考模型&#xff0c;但我們可以理解為OSI的一種實現 TCP/IP協議簡述 在很多情況下&#xff0c;它只是利用IP協議進行通信時&#xff0c;所必須用到的協議群的統稱&#xff0c;具體來說&#xff0c;I…

Spring-Cloud 學習筆記-(4)負載均衡器Ribbon

目錄 Spring-Cloud 學習筆記-&#xff08;4&#xff09;負載均衡器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、修改…