使用nodeAPI時遇到過異步問題解決
問題
閑逛技術群時常??吹饺河延龅疆惒絾栴}, 這里就最近看到的問題做個解答:
問題大致是這樣:
下面這段代碼, 是希望輸出456
的, 但實際上卻輸出了[]
, 因為readFile的回調會等到文件讀取完成才會執(zhí)行, readFile不會阻塞代碼運行, 因此return demo
會先執(zhí)行, 此時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提供回調函數(shù)來執(zhí)行讀完文件后的操作, 我們同樣可以提供回調函數(shù)來執(zhí)行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 ]
- 現(xiàn)代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
這里我們創(chuàng)建了一個Promise, 在readFile的回調函數(shù)執(zhí)行時我們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, 他們采用回調函數(shù)的方式實現(xiàn)異步, 因為在以前, 回調函數(shù)被用來實現(xiàn)異步, 之后出現(xiàn)了諸如Promise, async/await這樣的異步方案,現(xiàn)代的JS編程,更加鼓勵使用新方案,他們完全可以和以前的回調函數(shù)方案兼容。
以上就是使用nodeAPI時遇到過異步問題解決的詳細內容,更多關于nodeAPI異步問題的資料請關注腳本之家其它相關文章!
相關文章
Docker平臺下NodeJs?Puppeteer實現(xiàn)html轉pdf過程示例
這篇文章主要為大家介紹了Docker平臺下NodeJs?Puppeteer實現(xiàn)html轉pdf過程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12nodejs使用express創(chuàng)建一個簡單web應用
這篇文章主要介紹了nodejs使用express創(chuàng)建一個簡單web應用的相關資料,需要的朋友可以參考下2017-03-03nodeJS實現(xiàn)簡單網(wǎng)頁爬蟲功能的實例(分享)
下面小編就為大家?guī)硪黄猲odeJS實現(xiàn)簡單網(wǎng)頁爬蟲功能的實例(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-06-06Node.js實現(xiàn)壓縮與解壓數(shù)據(jù)
這篇文章介紹了Node.js實現(xiàn)壓縮與解壓數(shù)據(jù)的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-07-07Nodejs使用archiver-zip-encrypted庫加密壓縮文件時報錯(解決方案)
這篇文章主要介紹了Nodejs使用archiver-zip-encrypted庫加密壓縮文件時報錯,朋友朋友在測試過程中都出現(xiàn)過異常,下面小編把問題過程分析腳本之家平臺,需要的朋友可以參考下2019-11-11深入剖析Express cookie-parser中間件實現(xiàn)示例
本篇文章主要介紹了深入剖析Express cookie-parser中間件實現(xiàn)示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-02-02