经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » Node.js » 查看文章
使用nodeAPI时遇到过异步问题解决
来源:jb51  时间:2023/1/30 15:19:57  对本文有异议

问题

闲逛技术群时常常看到群友遇到异步问题, 这里就最近看到的问题做个解答:

问题大致是这样:

下面这段代码, 是希望输出456的, 但实际上却输出了[], 因为readFile的回调会等到文件读取完成才会执行, readFile不会阻塞代码运行, 因此return demo会先执行, 此时demo值为[].

  1. const fs = require('fs')
  2. const readFileFn = () => {
  3. let demo = []
  4. fs.readFile('./config.json', async function (err, date) {
  5. Promise.all([Promise.resolve(() => 456)]).then(res => {
  6. demo = res
  7. })
  8. })
  9. return demo
  10. }
  11. console.log('end', readFileFn()) // 要输出456

很典型的异步问题, 解决方法也由不少, 我们来探讨一下:

  • 既然readFile提供回调函数来执行读完文件后的操作, 我们同样可以提供回调函数来执行readFile结束后的操作:
  1. const fs = require('fs')
  2. const readFileFn = (callback) => {
  3. fs.readFile('./config.json', async function (err, date) {
  4. Promise.all([Promise.resolve(456)]).then(res => {
  5. callback(res)
  6. })
  7. })
  8. }
  9. readFileFn(data => console.log(data)) // [ 456 ]
  • 现代JS编程似乎更倾向于Promise风格, 同时我们结合async/await可以进一步简化代码
  1. const fs = require('fs')
  2. const readFileFn = async () => {
  3. const [result] = await Promise.all([
  4. new Promise(resolve => fs.readFile('./config.json', (err, data) => resolve(456))),
  5. ])
  6. return result
  7. }
  8. readFileFn().then(res => console.log(res)) // 456

这里我们创建了一个Promise, 在readFile的回调函数执行时我们resolve它, 这时Promise才算结束

  • 我们还可以之间让readFileFn返回一个Promise
  1. const readFileFn = () => {
  2. return new Promise(resolve => {
  3. fs.readFile('./config.json', async function (err, date) {
  4. Promise.all([Promise.resolve(456)]).then(res => {
  5. resolve(res)
  6. })
  7. })
  8. })
  9. }
  10. readFileFn().then(console.log) // [456]
  11. // readFileFn().then(res => console.log(res))

总结

在node中有很多类似于readFile的API, 他们采用回调函数的方式实现异步, 因为在以前, 回调函数被用来实现异步, 之后出现了诸如Promise, async/await这样的异步方案,现代的JS编程,更加鼓励使用新方案,他们完全可以和以前的回调函数方案兼容。

以上就是使用nodeAPI时遇到过异步问题解决的详细内容,更多关于nodeAPI异步问题的资料请关注w3xue其它相关文章!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号