阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

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

32次阅读
没有评论

共计 1510 个字符,预计需要花费 4 分钟才能阅读完成。

导读 这篇文章主要为大家介绍了使用 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 编程,更加鼓励使用新方案,他们完全可以和以前的回调函数方案兼容。

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-07-24发表,共计1510字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中