使用nodeAPI時(shí)遇到過異步問題解決
問題
閑逛技術(shù)群時(shí)常??吹饺河延龅疆惒絾栴}, 這里就最近看到的問題做個(gè)解答:
問題大致是這樣:
下面這段代碼, 是希望輸出456的, 但實(shí)際上卻輸出了[], 因?yàn)閞eadFile的回調(diào)會(huì)等到文件讀取完成才會(huì)執(zhí)行, readFile不會(huì)阻塞代碼運(yùn)行, 因此return demo會(huì)先執(zhí)行, 此時(shí)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提供回調(diào)函數(shù)來執(zhí)行讀完文件后的操作, 我們同樣可以提供回調(diào)函數(shù)來執(zhí)行readFile結(jié)束后的操作:
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風(fēng)格, 同時(shí)我們結(jié)合async/await可以進(jìn)一步簡(jiǎn)化代碼
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)建了一個(gè)Promise, 在readFile的回調(diào)函數(shù)執(zhí)行時(shí)我們r(jià)esolve它, 這時(shí)Promise才算結(jié)束
- 我們還可以之間讓readFileFn返回一個(gè)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))
總結(jié)
在node中有很多類似于readFile的API, 他們采用回調(diào)函數(shù)的方式實(shí)現(xiàn)異步, 因?yàn)樵谝郧? 回調(diào)函數(shù)被用來實(shí)現(xiàn)異步, 之后出現(xiàn)了諸如Promise, async/await這樣的異步方案,現(xiàn)代的JS編程,更加鼓勵(lì)使用新方案,他們完全可以和以前的回調(diào)函數(shù)方案兼容。
以上就是使用nodeAPI時(shí)遇到過異步問題解決的詳細(xì)內(nèi)容,更多關(guān)于nodeAPI異步問題的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
PostgreSQL Node.js實(shí)現(xiàn)函數(shù)計(jì)算方法示例
這篇文章主要給大家介紹了關(guān)于PostgreSQL Node.js實(shí)現(xiàn)函數(shù)計(jì)算的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-02-02
npm?install總是卡住不動(dòng)問題的解決辦法
在我們安裝完Node.js之后,需要使用npm命令來安裝一些工具,下面這篇文章主要給大家介紹了關(guān)于npm?install總是卡住不動(dòng)問題的解決辦法,需要的朋友可以參考下2022-05-05
Nodejs 和 Electron ubuntu下快速安裝過程
本文較為詳細(xì)的給大家介紹了Nodejs 和 Electron ubuntu下快速安裝過程,非常不錯(cuò),具有一定的參考借鑒價(jià)值,感興趣的朋友跟隨腳本之家小編一起學(xué)習(xí)吧2018-05-05
node將Excel數(shù)據(jù)轉(zhuǎn)為JSON的示例代碼
平時(shí)工作中我們基本都會(huì)接觸到excel數(shù)據(jù)表,但是在代碼中使用和處理數(shù)據(jù)的時(shí)候通常都要先將其轉(zhuǎn)為json格式數(shù)據(jù),json格式的數(shù)據(jù)可以更加方便我們進(jìn)行處理,那么我們要怎么將Excel數(shù)據(jù)轉(zhuǎn)為JSON數(shù)據(jù)呢,接下來本文給大家詳細(xì)介紹一下2024-11-11
詳解通過源碼解析Node.js中cluster模塊的主要功能實(shí)現(xiàn)
這篇文章主要介紹了詳解通過源碼解析Node.js中cluster模塊的主要功能實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-05-05
node+vue實(shí)現(xiàn)用戶注冊(cè)和頭像上傳的實(shí)例代碼
本篇文章主要介紹了node+vue實(shí)現(xiàn)用戶注冊(cè)和頭像上傳的實(shí)例代碼,具有一定的參考價(jià)值,有興趣的可以了解一下2017-07-07

