使用nodeAPI时遇到过异步问题解决
(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun)
问题
闲逛技术群时常常看到群友遇到异步问题, 这里就最近看到的问题做个解答:
问题大致是这样:
下面这段代码, 是希望输出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编程,更加鼓励使用新方案,他们完全可以和以前的回调函数方案兼容。
以上就是使用nodeAPI时遇到过异步问题解决的详细内容,更多关于nodeAPI异步问题的资料请关注程序员之家其它相关文章!
相关文章
如何在node.js中使用?JsonWebToken模块进行token加密
目前在web框架中最流行的身份验证是使用jsonwebtoken,简称jwt.可以设置加密方式,过期时间,存放个人信息,逆解析,下面这篇文章主要给大家介绍了关于如何在node.js中使用?JsonWebToken模块进行token加密的相关资料,需要的朋友可以参考下2023-03-03
最新评论