使用nodeAPI时遇到异步问题的解决方法

这篇文章主要为大家介绍了使用nodeAPI时遇到过异步问题解决,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

问题

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

问题大致是这样:

下面这段代码, 是希望输出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编程,更加鼓励使用新方案,他们完全可以和以前的回调函数方案兼容。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值