ES6-Promise学习笔记

181 阅读2分钟

promise 基本流程

image.png

为什么要用 Promise

1. 指定回调函数的方式更加灵活

  1. 旧的: 必须在启动异步任务前指定
  2. promise: 启动异步任务 => 返回promie对象 => 给promise对象绑定回调函数(甚至可以在异步任务结束后指定/多个)

2. 支持链式调用, 可以解决回调地狱问题

  1. 什么是回调地狱?

    回调函数嵌套调用, 外部回调函数异步执行的结果是嵌套的回调执行的条件

  2. 回调地狱的缺点?

    • 不便于阅读
    • 不便于异常处理
  3. 解决方案?

    promise 链式调用

  4. 终极解决方案?

    async/await

promise 注意事项

1. promise 函数体里面是立即执行的,异步操作(resolve/reject)在执行器中执行

var p = new Promise((resolve, reject) => {
    console.log('kkkkkkk');
    setTimeout(() => {
      resolve('sss');
    }, 1000);
    
});
console.log('#####');

输出结果:可暗处kkkkkk先打印,再过来#####

image.png

2. then方法的返回参数可以是promise对象,也可以是非promise对象。

普通的方法函数

  1. 返回值为null 返回成功的promise, 返回结果值为null
  2. 如果返回的参数为 非Promise类型的对象, 则返回的结果为成功promise对象,值为返回参数
  3. 可以通过throw 'error' 来返回错误的promise对象
  4. 如果传入的参数为 Promise 对象, 则参数的结果决定了 resolve 的结果

注意: 如果then的值不是方法,是promise对象,那么then的返回结果值还是上一个的promise返回结果值

function test() {
  return new Promise((resolve, reject) => {
    resolve('kkkk');
  })
}
var p = new Promise((resolve, reject) => {
  resolve('sss');
})
console.log(test().then(p));

他的输入结果: image.png

Promise.resolve和Promise.reject方法

Promise.resolve

  1. 如果传入的参数为 非Promise类型的对象, 则返回的结果为成功promise对象
  2. 如果传入的参数为 Promise 对象, 则参数的结果决定了 resolve 的结果

Promise.reject

  1. 无论传递的是什么参数,返回都是失败的promise对象。返回值就是他传递的的值