js异步问题

js中分为同步和异步代码

js 代码执行规则为:

  1. 从上到下执行
  2. 同步代码马上执行
  3. 异步代码先放到异步代码队列中,等待同步代码执行完毕后再去执行

使用promise进行修饰改造(使用node进行演示)

如果像下面代码:

const fs = require('fs')
var a = ''
fs.readFile('./fs/fs.text', 'utf8', (error, res) => {
  a = res
})
console.log(a) 
//此时的输出,a变量肯定是空的,因为读取文件的过程是异步,所以异步还没有执行,console.log(a)就已经执行了,就会输出a的原有值(a的原有值为空字符串)

那么怎么解决这种问题呢

方式一:

缺点:就会形成 回调地狱 ,代码少还行,如果后面很多逻辑都要使用这个res的值,那么回调函数里面就会出现好多代码,结构混乱,不够清晰

const fs = require('fs')
var a = ''
fs.readFile('./fs/fs.text', 'utf8', (error, res) => {
  a = res
  console.log(a) 
  //将console.log(a)放到回到函数里面此时a的值肯定是res
})

方式二:

使用Promise进行修饰

还是不够完美,then和catch又是异步

const fs = require('fs')
function ReadFile (url) {
  //创建promise实例,return返回它
  return new Promise((resolve, reject) => { 
    fs.readFile(url, 'utf8', (error, res) => {
      resolve(res) //成功返回
      reject(error)//错误返回
    })
  })
}
//调用后声明变量接收(值为promise)
let results = ReadFile('./fs/fs.text') 
//then是成功后要执行的方法,方法里面的callback的参数对应的是promise实例中的reslove中的参数,
results.then(res => {
  console.log(res)
})
//catch方法是有错时要执行的方法,方法里面的callback的参数对应的是promise实例中的reject中的参数,
.catch(res => {
  console.log(res)
})

方式三:

使用async和await (语法糖)

推荐!!!

await只能在异步中使用并且await只能接收Promise,而async可以一个方法修饰成异步,再使用Promise进行结合使用

const fs = require('fs')
function ReadFile (url) {
  //创建promise实例,return返回它
  return new Promise((resolve, reject) => {
    fs.readFile(url, 'utf8', (error, res) => {
      resolve(res) //成功返回
      reject(error)//错误返回
    })
  })
}
async function f1 () {
  let a = await ReadFile('./fs/fs.text')
  console.log(a)
}
f1()
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

要爆炸的臭臭君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值