Promise-->面试100%常考

一.回调函数

  • 就是把函数 A 当作参数传递到 函数 B 中,在函数 B 中以行参的方式进行调用
function a(cb) {
  cb()
}

function b() {
  console.log('我是函数 b')
}

a(b)
  • 为什么需要回调函数
    • 当我们执行一个异步的行为的时候,我们需要在一个异步行为执行完毕之后做一些事情
    • 那么,我们是没有办法提前预知这个异步行为是什么时候完成的
    • 我们就只能以回调函数的形式来进行
    • 就比如我们刚刚封装过的那个 ajax 函数里面的 success
    • 我们并不知道 ajax 请求什么时候完成,所以就要以回调函数的形式来进行

二.回调地狱

  • 回调地狱,其实就是回调函数嵌套过多导致的*
   ajax({
            url: 'a',
            success: function () {
                ajax({
                    url: 'b',
                    success: function () {
                        ajax({
                            url: 'c',
                            success: function () {

                            }
                        })
                    }
                })
            }
        })

三.Promise 见MDN文档

面试会常考,它是es6中

  • 作用:它是解决回调地狱的
  • 承诺,es6 提供的一个语法,执行一个异步事件的时候,会把结果返回给你
  • 语法:
    • new Promise(function (resolve, reject){要执行的异步事件}
    • promise有2个函数p.then成功,p.catch失败
    • resolve成功调用then,reject失败调用catch
    • 三个状态pending 执行中、resolved 成功、rejected 失败
new Promise(function (resolve, reject) {
  // resolve 表示成功的回调
  // reject 表示失败的回调
}).then(function (res) {
  // 成功的函数
}).catch(function (err) {
  // 失败的函数
})
  • promise 来解决多个 ajax 发送的问题
new Promise(function (resolve, reject) {
  ajax({
    url: '第一个请求',
    success (res) {
      resolve(res)
    }
  })
}).then(function (res) {
  // 准备发送第二个请求
  return new Promise(function (resolve, reject) {
    ajax({
      url: '第二个请求',
      data: { a: res.a, b: res.b },
      success (res) {
        resolve(res)
      }
    })
  })
}).then(function (res) {
  ajax({
    url: '第三个请求',
    data: { a: res.a, b: res.b },
    success (res) {
      console.log(res)
    }
  })
})

四.ASYNC/AWAIT

  • async/await 是一个 es7 的语法,都是关键字

  • async是异步操作,也是关键字,多行的是promise对象,它的前身是generator

  • 这个语法是 回调地狱的终极解决方案

  • 异步代码写的就看起来像一个同步代码了

async function fn() {
  const res = new Promise(function (resolve, reject) {
    ajax({
      url: '第一个地址',
      success (res) {
        resolve(res)
      }
    })
  })
  
  // res 就可以得到请求的结果
  const res2 = new Promise(function (resolve, reject) {
    ajax({
      url: '第二个地址',
      data: { a: res.a, b: res.b },
      success (res) {
        resolve(res)
      }
    })
  })
  
  const res3 = new Promise(function (resolve, reject) {
    ajax({
      url: '第三个地址',
      data: { a: res2.a, b: res2.b },
      success (res) {
        resolve(res)
      }
    })
  })
  
  // res3 就是我们要的结果
  console.log(res3)
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值