使用nodeAPI時遇到非同步問題的解決方法
導讀 | 這篇文章主要為大家介紹了使用nodeAPI時遇到過非同步問題解決,有需要的朋友可以借鑑參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪 |
問題
閒逛技術群時常常看到群友遇到非同步問題, 這裡就最近看到的問題做個解答:
問題大致是這樣:
下面這段程式碼, 是希望輸出456的, 但實際上卻輸出了[], 因為readFile的回撥會等到檔案讀取完成才會執行, readFile不會阻塞程式碼執行, 因此return demo會先執行, 此時demo值為[].
const fs = require('fs') const readFileFn = () => { let demo = [] fs.readFile('./config.json', async function (err, date) { Promise.all([Promise.resolve(() => 456)]).then(res => { demo = res }) }) return demo } console.log('end', readFileFn()) // 要輸出456
很典型的非同步問題, 解決方法也由不少, 我們來探討一下:
既然readFile提供回撥函式來執行讀完檔案後的操作, 我們同樣可以提供回撥函式來執行readFile結束後的操作:
const fs = require('fs') const readFileFn = (callback) => { fs.readFile('./config.json', async function (err, date) { Promise.all([Promise.resolve(456)]).then(res => { callback(res) }) }) } readFileFn(data => console.log(data)) // [ 456 ]
現代JS程式設計似乎更傾向於Promise風格, 同時我們結合async/await可以進一步簡化程式碼
const fs = require('fs') const readFileFn = async () => { const [result] = await Promise.all([ new Promise(resolve => fs.readFile('./config.json', (err, data) => resolve(456))), ]) return result } readFileFn().then(res => console.log(res)) // 456
這裡我們建立了一個Promise, 在readFile的回撥函式執行時我們resolve它, 這時Promise才算結束
我們還可以之間讓readFileFn返回一個Promise
const readFileFn = () => { return new Promise(resolve => { fs.readFile('./config.json', async function (err, date) { Promise.all([Promise.resolve(456)]).then(res => { resolve(res) }) }) }) } readFileFn().then(console.log) // [456] // readFileFn().then(res => console.log(res))
總結
在node中有很多類似於readFile的API, 他們採用回撥函式的方式實現非同步, 因為在以前, 回撥函式被用來實現非同步, 之後出現了諸如Promise, async/await這樣的非同步方案,現代的JS程式設計,更加鼓勵使用新方案,他們完全可以和以前的回撥函式方案相容。
原文來自:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2937988/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 遇到問題的解決方法
- 今天遇到的問題與解決方法
- CKEditor使用中遇到的問題解決
- 解決在使用Amoeba遇到的問題
- Selenium爬蟲遇到超時TimeOut問題的解決方法爬蟲
- 裝SAP GUI時遇到的問題及解決GUI
- GO Modules的理解和遇到的問題解決方法Go
- 使用 redisson 時遇到的問題Redis
- 使用EasyX製作遊戲需要讀寫檔案時遇到編碼問題的解決方法遊戲
- 安裝sql server遇到問題解決方法SQLServer
- 部署專案遇到的mysql問題以及解決方法MySql
- 關於BGE-M3接入LangChain時遇到的問題與解決方法LangChain
- Eclipse中使用的容器超時問題解決方法Eclipse
- LINUX 解決時間同步問題(NTP)Linux
- UG程式設計常遇到的問題及解決方法程式設計
- 安裝vCenter6.0遇到的問題以及解決方法
- steam提示:在連線至steam伺服器時遇到問題解決方法伺服器
- mysql登入遇到ERROR 1045問題解決方法MySqlError
- Word文件儲存時常遇到的問題及其解決方
- 解決Docker容器時區及時間不同步的問題Docker
- 玩Deno遇到問題的解決方案
- 解決 plsql 遇到亂碼的問題SQL
- MAC 安裝 VMAF 遇到的問題及解決方法記錄Mac
- Hanlp配置自定義詞典遇到的問題與解決方法HanLP
- Amigo學習(一)解決使用中遇到的問題Go
- 使用async/await更好的解決非同步問題AI非同步
- 遊戲陪玩原始碼的輪詢鎖,使用時遇到的問題與解決方案遊戲原始碼
- 解決代理超時問題的三種方法
- .Net Core3.1中SameSite的使用方法、遇到的問題以及解決辦法
- 怎樣解決更新MacOS big sur時遇到的那些問題!Mac
- 近兩天學習使用 Homestead 過程中遇到的問題及解決方法
- 使用Android Studio 遇到的坑爹問題及解決方法(持續更新中)Android
- win10提示您已遇到關鍵問題的解決方法Win10
- 更新macOS Monterey後遇到的各種Bug問題及解決方法Mac
- Chrome安裝sci-hub外掛遇到的問題解決方法Chrome
- Rails 3 升級 Rails 4 中遇到的問題及解決方法AI
- 【DataBase】:使用Oracle遇到的幾個問題及解決辦法DatabaseOracle
- HTC Vive遇到的問題解決辦法