使用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)文章
Docker平臺(tái)下NodeJs?Puppeteer實(shí)現(xiàn)html轉(zhuǎn)pdf過程示例
這篇文章主要為大家介紹了Docker平臺(tái)下NodeJs?Puppeteer實(shí)現(xiàn)html轉(zhuǎn)pdf過程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12Node.js與PHP、Python的字符處理性能對(duì)比
因?yàn)楹罄m(xù)考慮實(shí)現(xiàn) Fl 引擎的Node.js版本,所以對(duì)比了下Node.js和PHP的字符處理性能。發(fā)現(xiàn)Node.js真是甩了PHP幾條街啊,再測(cè)試了下Python,比PHP還慢。2014-07-07nodejs使用express創(chuàng)建一個(gè)簡(jiǎn)單web應(yīng)用
這篇文章主要介紹了nodejs使用express創(chuàng)建一個(gè)簡(jiǎn)單web應(yīng)用的相關(guān)資料,需要的朋友可以參考下2017-03-03nodeJS實(shí)現(xiàn)簡(jiǎn)單網(wǎng)頁爬蟲功能的實(shí)例(分享)
下面小編就為大家?guī)硪黄猲odeJS實(shí)現(xiàn)簡(jiǎn)單網(wǎng)頁爬蟲功能的實(shí)例(分享)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-06-06Node.js基礎(chǔ)入門之模塊與npm包管理器使用詳解
Node.js是一個(gè)基于Chrome?V8引擎的JavaScript運(yùn)行時(shí)。類似于Java中的JRE,.Net中的CLR。本文將詳細(xì)為大家介紹Node.js中的模塊與npm包管理器的使用,需要的可以參考一下2022-03-03Node.js設(shè)置CORS跨域請(qǐng)求中多域名白名單的方法
這篇文章主要介紹了Node.js設(shè)置CORS跨域請(qǐng)求中多域名白名單的方法,文中通過示例代碼介紹的非常詳細(xì),相信對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來一起看看吧。2017-03-03Node.js實(shí)現(xiàn)壓縮與解壓數(shù)據(jù)
這篇文章介紹了Node.js實(shí)現(xiàn)壓縮與解壓數(shù)據(jù)的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07Nodejs使用archiver-zip-encrypted庫加密壓縮文件時(shí)報(bào)錯(cuò)(解決方案)
這篇文章主要介紹了Nodejs使用archiver-zip-encrypted庫加密壓縮文件時(shí)報(bào)錯(cuò),朋友朋友在測(cè)試過程中都出現(xiàn)過異常,下面小編把問題過程分析腳本之家平臺(tái),需要的朋友可以參考下2019-11-11深入剖析Express cookie-parser中間件實(shí)現(xiàn)示例
本篇文章主要介紹了深入剖析Express cookie-parser中間件實(shí)現(xiàn)示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-02-02