笔记-promise

基本使用

const mypro = new Promise((resolve,reject)=>{
  resolve(成功了)
  reject(失败了)
  // 注意 结果只会更改一次,一旦改变立刻冻结。不会在发生第二次改变。
})

API

  1. Promise.resolve() 快速创建一个成功的Promise实例对象
  2. Promise.reject() 快速创建一个失败的Promise实例对象
  3. Promise.all([p1,p2,p3]) 接受一个数组作为参数,数组成员均为promise实例对象,返回一个promise实例对象。如果数组中所有成员都resolve()则成功,如果有一个成员reject,则返回的promise也是reject
  const p1 = new Promise((resolve,reject) => {
    resolve(1)
  });
  const p2 = Promise.resolve(2);
  const p3 = Promise.reject(3);
  
  // 如果promise都为resolve,则all的结果也是resolve
  // 只要有一个不是reject,则all为reject
  const all = Promise.all([p1,p2,p3]) 
  all.then(value=>{
    console.log(value);
  }).catch(err => {
    console.log('出错了 ' + err);
  })
  1. Promise.race([p1,p2,p3]) 接受一个数组作为参数,数组成员均为promise实例对象,返回一个promise实例对象。数组中成员第一个执行完毕的结果将会作为返回promise对象的结果。
  const p1 = new Promise((resolve,reject) => {
   setTimeout(() => {
    resolve(1)
   }, 2000);
  });
  const p2 = Promise.resolve(2);
  const p3 = Promise.reject(3);
  
  // 取最先完成的promise结果
  const all = Promise.race([p1,p2,p3])  
  all.then(value=>{
    console.log(value);
  }).catch(err => {
    console.log('出错了 ' + err);
  })

关于promise的几个问题

如何改变promise的状态
1. resolve()  ---> (状态变为resolved)
2. reject()  ---> (状态变为rejected)
3. 内部抛出异常 ---> (状态变为rejected)
给promise指定多个成功\失败的回调函数,都会调用吗?
  • 当promise改变状态时,都会调用绑定的回调函数。
promise.then()返回的新promise状态由什么决定?
  • 简单表达:由then指定的回调函数运行结果决定
  • 详细表达:
    • ① 如果抛出异常,新promise状态变为rejected
    • ② 如果返回的是非promise,新promise变为resolve,value为返回的值
    • ③ 如果返回一个promise,则返回的promise的结果会成为新promise的结果
promise如何串联多个操作任务?
  1. promise的then()返回一个新的promise,可以使用then()的链式调用
  2. 通过then()的链式调用串联多个同步\异步任务
// promise串联多个 同步|异步 任务
new Promise((resolve,reject)=>{
  setTimeout(()=>{
  console.log('异步任务1 开始');
    resolve(1)
  },1000)
}).then((value)=>{
  console.log('异步任务1 结果:' + value);
  console.log('同步任务2 开始');
  return 2
})
.then((value)=>{
  console.log('同步任务2 结果:' + value);
  console.log('异步任务3 开始');
  // 如果是异步任务 则需要用promise对象来返回其值
  return new Promise((resolve,reject)=>{
    setTimeout(()=>{
      resolve(3)
    },1000)
  })
})
.then((value)=>{
  // 1s后输出 3
  console.log('异步任务3 结果:' + value);
})
promise错误的穿透
  • 如果promise的状态变成reject,不会跳过then方法直接调用catch,而是在then中逐层传递错误信息,直达catch捕获。相当于then的第二个参数被执行了,执行的默认值就是 err=>Promise.reject(err)
如何中断promise链
  • 返回一个pending状态的promise即可。
.then(()=>{
  return new Promise(()=>{})
}).then(()=>{
  console.log('我不会被执行!!!')
})
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。