使用nodeAPI时遇到过异步问题解决
更新时间:2023年1月30日 08:20 点击:556 作者:举案
问题
闲逛技术群时常常看到群友遇到异步问题, 这里就最近看到的问题做个解答:
问题大致是这样:
下面这段代码, 是希望输出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异步问题的资料请关注猪先飞其它相关文章!
原文出处:https://juejin.cn/post/7193283783549222970
相关文章
- 这篇文章主要介绍了C#中异步和多线程的相关资料,帮助大家更好的理解和学习c#,感兴趣的朋友可以了解下...2021-01-16
- 多线程和异步操作两者都可以达到避免调用线程阻塞的目的,从而提高软件的可响应性。甚至有些时候我们就认为多线程和异步操作是等同的概念。但是,多线程和异步操作还是有一些区别的。而这些区别造成了使用多线程和异步操作的时机的区别...2020-06-25
- 本篇文章主要介绍了C# Socket异步通信,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
- 这篇文章主要给大家介绍了关于c# winform异步不卡界面的实现方法,文中通过示例代码介绍的非常详细,对大家学习或者使用c#具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2020-06-25
- 这篇文章主要给大家介绍了关于JS异步的执行原理和回调的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-08
- 这篇文章主要介绍了JQuery基于FormData异步提交数据文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-09-02
- 这篇文章主要介绍了JQuery异步提交表单与文件上传功能,结合实例形式分析了jQuery表单提交及文件传输操作的相关实现技巧,需要的朋友可以参考下...2017-01-16
如何使用PHP+jQuery+MySQL实现异步加载ECharts地图数据(附源码下载)
ECharts地图主要用于地理区域数据的可视化,展示不同区域的数据分布信息,通过本文给大家介绍如何使用PHP+jQuery+MySQL实现异步加载ECharts地图数据,需要的朋友参考下吧...2016-02-26- 这篇文章主要介绍了C#异步的世界(下),对异步感兴趣的同学,可以参考下...2021-04-26
c#异步操作后台运行(backgroundworker类)示例
这篇文章主要介绍了c#异步操作后台运行(backgroundworker类)示例,需要的朋友可以参考下...2020-06-25- 这篇文章主要介绍了ASP.Net中的async+await异步编程的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-09-22
- 这篇文章主要介绍了Spring @Async无法实现异步的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-10-02
- 这篇文章主要介绍了又拍云异步上传实例教程详解的相关资料,需要的朋友可以参考下...2016-04-23
- 这篇文章主要介绍了NodeJs并发异步的回调处理的相关资料,需要的朋友可以参考下...2015-12-24
- 本篇文章主要介绍了Yii2.0中使用js异步删除示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 ...2017-03-12
- 这篇文章主要介绍了C#实现异步发送邮件的方法,涉及C#异步操作与邮件发送的技巧,非常具有实用价值,需要的朋友可以参考下...2020-06-25
- 下面小编就为大家分享一篇asp.net使用H5新特性实现异步上传的示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-09-22
- 这篇文章主要介绍了php实现异步将远程链接上内容(图片或内容)写到本地的方法,涉及php基于curl进行远程文件传输的相关操作技巧,需要的朋友可以参考下...2016-12-02
- 这篇文章主要给大家介绍了关于C#异步方法返回void与Task的区别的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-04
- 这篇文章主要介绍了JAVA同步、异步、阻塞和非阻塞之间的区别,文中讲解非常细致,帮助大家更好的理解和学习,感兴趣的朋友可以了解下...2020-08-01