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

