當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
nodeJS中的异步编程
生活随笔
收集整理的這篇文章主要介紹了
nodeJS中的异步编程
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
nodejs 不是單線程 在博客項目中關(guān)于異步問題:
1.當用戶添加一條博客時 需要通過post方式向服務(wù)器發(fā)送數(shù)據(jù) 后臺獲取用戶以post方式拿到傳送過來的數(shù)據(jù) 然后存入數(shù)據(jù)庫:
上面的代碼:創(chuàng)建一個空字符串 當用戶向服務(wù)器發(fā)送請求時出發(fā)data事件將依次獲取來數(shù)據(jù)進行拼接 當用戶請求結(jié)束后出發(fā)end事件 將拼接后的字符串賦值給req.postData屬性 理想中的代碼執(zhí)行順序如下:
但是代碼中的data和end事件 都是屬于異步 SO 真正執(zhí)行如下:
因為同步代碼優(yōu)先執(zhí)行 異步代碼等同步代碼之行結(jié)束后再根據(jù)規(guī)則執(zhí)行 這就造成后臺接收不到傳送的數(shù)據(jù)
使用Promise解決異步問題:將異步代碼放入Promise中 將要傳送的數(shù)據(jù)放到resolve方法中作為參數(shù)
當上面代碼執(zhí)行完成后才執(zhí)行下面的then里面的代碼 同時也回想resolve中的參數(shù)傳到下面的形參result中 在將其賦值給req.postData 將后續(xù)代碼放在then中
2.當nodeJS操作數(shù)據(jù)庫時也存在異步:
var mysql = require('mysql'); var connection = mysql.createConnection({host: 'localhost',user: 'root',password: 'root',database: 'nodeblog' });//開始連接 connection.connect();//查詢所有數(shù)據(jù) let sql = 'SELECT * FROM student' connection.query(sql, (err, result) => {if (err) {console.log('sorry');return;}console.log(result); });console.log('查詢結(jié)束')上面代碼的執(zhí)行結(jié)果為:
說明:雖然查詢學生表的代碼書寫在前 但是優(yōu)先輸出“查詢結(jié)束”可見后續(xù)代碼不會等到查詢學生表代碼執(zhí)行結(jié)束后才執(zhí)行
解決方法:也是通過Promise
紅色框內(nèi)為異步代碼 黃色框內(nèi)為后續(xù)代碼!!!
3.使用Promise實現(xiàn)依次讀取文件:
/**依次讀取文件*///拿到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
總結(jié)
以上是生活随笔為你收集整理的nodeJS中的异步编程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 常见的网络协议和端口号
- 下一篇: Java自定义标签