• 【学习笔记71】数据代理、回调函数和回调地域


    一、数据代理

    •  new Proxy(参数一: 代理那个对象)
    1. const obj = {
    2. name: 'QF001',
    3. age: 18
    4. }
    5. const res = new Proxy(obj, {
    6. get (target, p) {
    7. /**
    8. * target 当前代理的那个对象, 在当前案例中就是obj
    9. * p proxy会自动遍历对象, 拿到对象每一个key
    10. */
    11. return target[p];
    12. },
    13. set (target, p, val) {
    14. target[p] = val;
    15. console.log('你想要修改某一个属性')
    16. // 代表修改成功
    17. return true;
    18. }
    19. })
    20. res.age = 99;
    21. obj.abc = 999;
    22. console.log(res);

     二、回调函数

    • 把函数A 通参数的形式传递给函数B, 在函数B内部以形参方式调用函数A就叫函数B的回调函数
    • 通常用到回调函数的场景都是在异步代码封装

    1、回调函数

    1. function A () {
    2. console.log('函数A执行')
    3. }
    4. function B(cb) {
    5. console.log('函数B执行')
    6. cb()
    7. }
    8. B(A)

     2. 封装一个异步函数,一般都是网络请求

    1. function fn (arg) {
    2. const timer = Math.ceil(Math.random() * 3000)
    3. setTimeout(() => {
    4. console.log('异步代码开始执行, 耗时:', timer)
    5. arg()
    6. }, timer)
    7. }
    8. fn(
    9. () => {
    10. console.log('异步代码执行完成我再执行')
    11. }
    12. )

    3. 因为网络请求, 可能会成功, 也有可能失败

    • 约定: 时间超过3500算作失败, 否则算成功
    1. function fn (chenggong, shibai) {
    2. console.log('班长帮我去买一瓶水')
    3. const timer = Math.ceil(Math.random() * 3000) + 2000
    4. setTimeout(() => {
    5. if (timer > 3500) {
    6. console.log('班长买水失败', timer)
    7. shibai()
    8. } else {
    9. console.log('班长买水成功', timer)
    10. chenggong()
    11. }
    12. }, timer)
    13. }
    14. fn(
    15. () => {
    16. console.log('谢谢班长辛苦了, 帮我退掉吧')
    17. },
    18. () => {
    19. console.log('辛苦班长了, 买不到别回来了')
    20. }
    21. )

    三、回调地狱

    • 并不是一个bug, 而是一种代码格式, 这种代码格式非常不利于我们阅读
    • 解决:Promise(期约) ,解决回调地狱代码的

    1、案例需求:

    • 第一次买水成功以后, 再次执行一边, 但, 必须是第一次买水成功以后才能再去买一瓶
    • 在第二次买水成功以后, 再次执行一边, 但, 必须是第二次买水成功以后才能再去买一瓶
    1. function fn(chenggong, shibai) {
    2. console.log('班长帮我去买一瓶水')
    3. const timer = Math.ceil(Math.random() * 3000)
    4. setTimeout(() => {
    5. if (timer > 3500) {
    6. console.log('班长买水失败', timer)
    7. shibai()
    8. } else {
    9. console.log('班长买水成功', timer)
    10. chenggong()
    11. }
    12. }, timer)
    13. }
    14. fn(
    15. () => {
    16. console.log('谢谢班长辛苦了, 帮我退掉吧')
    17. fn(
    18. () => {
    19. console.log('第二次买水成功')
    20. fn(
    21. () => {
    22. console.log('第三次买水成功')
    23. },
    24. () => {
    25. console.log('第三次买水失败')
    26. }
    27. )
    28. },
    29. () => {
    30. console.log('第二次买水失败')
    31. }
    32. )
    33. },
    34. () => {
    35. console.log('辛苦班长了, 买不到别回来了')
    36. }
    37. )

  • 相关阅读:
    直击永悦科技半年报:双轮驱动下的“增长曲线”
    java基于ssm+jsp的高校失物招领系统 (代码+数据库+LW+调试)
    AWD学习总结 (会持续更新)
    系列文章|云原生时代下微服务架构进阶之路 - Snap-E
    OFD转PDF ~java实现
    另类又不另类的shiro检测方式
    【曹工杂谈】 2021在鹅厂干了一年,我的一些感悟
    使用 MySQL 进行分页
    推荐10个堪称神器的 Java 学习网站
    kafka消费者模式
  • 原文地址:https://blog.csdn.net/m0_58190023/article/details/128054275