异步与回调

什么是异步?什么是同步?

  • 能直接拿到结果,就是同步,比如医院挂号,拿到号才会离开窗口
  • 不能直接拿到结果,就是异步,比如餐厅等位取号,拿到号后,可以去做别的事
    可以每十分钟去餐厅问一下(轮询)
    也可以扫码用微信接收通知(回调)
  • 异步的结果可以通过轮询获取,轮询就是定时去询问结果拿到了没有
  • 也可以通过回调获取,一般来说结果会被作为回调的第一个参数
  • 异步的好处是可以把用来等待的时间拿去做别的事情

什么是回调(callback)?

  • 写了却不调用,给别人调用的函数就是回调
  • 比如写一个函数 A,传给另一个函数 B 调用,那么函数 A 就是回调
  • 回调可以用于同步任务,不一定非要用于异步任务
  • array.forEach(n=> console.log(n))就是同步回调
  • 有的时候回调还可以传给一个对象,如 request.onreadystatechange,等待浏览器来调用

异步和回调的关系

  • 异步任务需要在得到结果时通知 JS 来拿结果
  • 可以让 JS 写留一个函数地址给浏览器
  • 异步任务完成时浏览器调用该函数地址即可
  • 同时把结果作为参数传给该函数
  • 这个函数是写给浏览器调用的,所以是回调函数

如何判断同步还是异步?

如果一个函数的返回值处于

  • setTimeout
  • AJAX (即 XMLHttpRequest)
  • AddEventListener

这三个东西内部,那么这个函数就是异步函数

回调举例

function()摇骰子 {
  setTimeout(() => {
      return parseInt(Math.random() * 6) + 1
    }, 1000)
    // return undefined
}
  • 摇骰子()没有写 return,那就是 return undefined
  • 箭头函数里有 return,返回真正的结果
  • 所以这是一个异步函数
const n = 摇骰子()
console.log(n) //undefined

如何获取函数结果?

  • 可以用回调
  • 写个函数,然后把函数地址给它
function f1(×) {console.log(x)}摇骰子(f1)

然后要求摇骰子函数得到结果后把结果作为参数传给 f1

function(fn) {
  setTimeout(() => { //
    fn(parseInt(Math.random() * 6) + 1)
  }, 1000)
}

由于 f1 声明之后只用了一次,所以可以删掉 f1,简化为箭头函数

function f1(x) {console.log(x)}
摇骰子(f1)

改为

摇筛子(x => {
    console.log(x)
})

再简化为

摇骰子(console.log)

总结

  • 异步任务不能拿到结果
  • 于是我们传一个回调给异步任务
  • 异步任务完成时调用回调
  • 调用的时候把结果作为参数

 *本文为鲲游北冥的原创文章,著作权归本人和饥人谷所有,转载务必注明来源

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值