使用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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 遇到問題的解決方法
- Selenium爬蟲遇到超時TimeOut問題的解決方法爬蟲
- GO Modules的理解和遇到的問題解決方法Go
- LINUX 解決時間同步問題(NTP)Linux
- 部署專案遇到的mysql問題以及解決方法MySql
- 關於BGE-M3接入LangChain時遇到的問題與解決方法LangChain
- 使用EasyX製作遊戲需要讀寫檔案時遇到編碼問題的解決方法遊戲
- mysql登入遇到ERROR 1045問題解決方法MySqlError
- 使用async/await更好的解決非同步問題AI非同步
- steam提示:在連線至steam伺服器時遇到問題解決方法伺服器
- MAC 安裝 VMAF 遇到的問題及解決方法記錄Mac
- Hanlp配置自定義詞典遇到的問題與解決方法HanLP
- 玩Deno遇到問題的解決方案
- 怎樣解決更新MacOS big sur時遇到的那些問題!Mac
- .Net Core3.1中SameSite的使用方法、遇到的問題以及解決辦法
- 解決Docker容器時區及時間不同步的問題Docker
- 解決代理超時問題的三種方法
- win10提示您已遇到關鍵問題的解決方法Win10
- Chrome安裝sci-hub外掛遇到的問題解決方法Chrome
- 更新macOS Monterey後遇到的各種Bug問題及解決方法Mac
- 遊戲陪玩原始碼的輪詢鎖,使用時遇到的問題與解決方案遊戲原始碼
- nodejs 近期所遇到的問題及解決NodeJS
- 如何解決使用JSON.stringify時遇到的迴圈引用問題JSON
- 使用ogg 從oracle 同步mysql遇到問題記錄OracleMySql
- vue渲染時閃爍{{}}的問題及解決方法Vue
- C#操作時區轉換時遇到的一些問題和解決方法分享C#
- 近期工作遇到的問題及解決方式收藏
- 解決macbook安裝burp suite遇到的問題MacUI
- RT-Thread 元件 FinSH 使用時遇到的問題thread元件
- Nuxt使用axios跨域問題解決方法UXiOS跨域
- 使用git遇到的問題Git
- mydumper執行報錯遇到缺失libssl.so.1.1問題的解決方法
- 啟動rocketmq-client-python測試遇到的問題解決方法記錄MQclientPython
- oracle 11.2.0.4 DataGuard Broker配置過程中可能遇到的問題及解決方法Oracle
- 搭建Laravel Sail開發環境遇到的版本不匹配問題解決方法LaravelAI開發環境
- 解決vue使用Sass時候的報錯問題Vue
- 在防護DDoS時會遇到哪些問題,該怎樣解決?
- 在迴圈陣列時使用splice()方法刪除陣列遇到的問題陣列