當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
nodeJS中的异步编程
生活随笔
收集整理的這篇文章主要介紹了
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
總結
以上是生活随笔為你收集整理的nodeJS中的异步编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 常见的网络协议和端口号
- 下一篇: 《JavaScript高级程序设计》笔记