使用nodeAPI时遇到过异步问题解决

 更新时间:2023年01月28日 16:01:40   作者:举案  
这篇文章主要为大家介绍了使用nodeAPI时遇到过异步问题解决,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云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异步问题的资料请关注程序员之家其它相关文章!

相关文章

  • k8s node节点重新加入master集群的实现

    k8s node节点重新加入master集群的实现

    这篇文章主要介绍了k8s node节点重新加入master集群的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • 浅谈node.js中间件有哪些类型

    浅谈node.js中间件有哪些类型

    这篇文章主要介绍了node.js中间件有哪些类型,对中间件感兴趣的同学,可以参考下
    2021-04-04
  • 如何优雅地在Node应用中进行错误异常处理

    如何优雅地在Node应用中进行错误异常处理

    这篇文章主要介绍了如何优雅地在Node应用中进行错误处理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • NodeJs超长字符串问题处理的详细分析

    NodeJs超长字符串问题处理的详细分析

    这篇文章主要给大家介绍了关于NodeJs超长字符串问题处理的详细分析,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2023-02-02
  • node实现登录图片验证码的示例代码

    node实现登录图片验证码的示例代码

    这篇文章主要介绍了node实现登录图片验证码的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • Node交互式的SFTP上传实现过程剖析

    Node交互式的SFTP上传实现过程剖析

    这篇文章主要为大家介绍了Node交互式的SFTP上传实现过程剖析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • pm2工具在Node.js开发部署中的重要作用详解

    pm2工具在Node.js开发部署中的重要作用详解

    这篇文章主要为大家介绍了pm2工具在Node.js开发部署中的重要作用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • 如何在node.js中使用?JsonWebToken模块进行token加密

    如何在node.js中使用?JsonWebToken模块进行token加密

    目前在web框架中最流行的身份验证是使用jsonwebtoken,简称jwt.可以设置加密方式,过期时间,存放个人信息,逆解析,下面这篇文章主要给大家介绍了关于如何在node.js中使用?JsonWebToken模块进行token加密的相关资料,需要的朋友可以参考下
    2023-03-03
  • Node.js中处理特殊字符的文件名解决方案

    Node.js中处理特殊字符的文件名解决方案

    在Node.js中,通过path模块提供的basename方法,我们可以轻松地从文件路径中提取文件名,在这篇文章中,我们将介绍一种安全稳妥的方法,结合使用dirname和长度计算,以处理特殊字符的文件名,感兴趣的朋友跟随小编一起看看吧
    2024-03-03
  • Node.js使用WebAssembly

    Node.js使用WebAssembly

    本文主要介绍了Node.js使用WebAssembly,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05

最新评论

?


http://www.vxiaotou.com