Promise扫盲贴

 更新时间:2019年06月24日 14:38:31   作者:漓漾li  
这篇文章主要介绍了Promise扫盲贴,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

then

then函数可以return另一个promise:

const p1 = new Promise((resolve, reject) =>{
  resolve('p1')
})
const p2 = new Promise((resolve, reject) =>{
 setTimeout(() =>{
  resolve('p2')
 },3000)
})
p1.then(res => {
 console.log(res)
  return p2
}).then(res =>{ 
  // p2 resolve后才执行
  console.log(res)
})
//p1
// 3s后输出...
// p2

那么这个p2就会代替当前p1的状态,等到新的p2的状态修改时,下一个then才会执行

catch

1. 作用

可以捕获到promise程序执行中的error,等同于  .then(null, rejection)  或  .then(undefined, rejection)

2. 可以获取到的错误

promise函数体中抛出的error。在promise resolve后,再抛出错误,不会被捕获

const p1 = new Promise((resolve,reject) => {throw new Error('error')})
p1.catch(error => console.log(error))  // Error: error

promise的reject操作

const p2 = new Promise((resolve,reject) => reject('rejected'))
p2.catch(error => console.log(error)) // rejected

then 函数体中抛出的error

const p3 = new Promise((resolve,reject) => resolve('resolved'))
p3.then(res =>{
  throw new Error('error')
}).catch(error => console.log(error)) // Error: error

then函数可以返回一个promise(如果没有定义catch方法),如果这个promise函数体中有reject或者error,也可以捕获到

3. 推荐使用catch方式捕获错误,而不是then的第二个参数:

因为catch可以捕获到它前面所有then方法中的错误

finally

  • 不管promise最后状态如何,都会执行的操作
  • 没有参数,获取不到当前promise最后的状态

Promise.all

1. 参数

参数不仅仅可以是数组,具有Iterator接口的对象都可以。
数组参数的每一个元素为promise实例,如果不是,就会调用Promise.resolve转换为Promise实例

const obj = {
  [Symbol.iterator]() {
    let index = 0
    return {
      next() {
        return {
          // promise对象 和 其他类型都可以
          value: new Promise(resolve => resolve(index++)), done: index > 2
          // value: index++, done: index > 2
        }
      }
    }
  }
}
const p = Promise.all(obj)
p.then(res => {
  console.log(res) // [0, 1]
}) 

2. 状态

const p = Promise.all([p1, p2, p3]);

p的状态由p1、p2、p3决定,分成两种情况:

  • 只有p1、p2、p3的状态都变成fulfilled,p的状态才会变成fulfilled,此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数。
  • 只要p1、p2、p3之中有一个被rejected,p的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数。

3. catch

如果参数中的promise定义了catch方法,那么Promise.all()的catch就不会捕获到错误

Promise.race

  • 只要p1、p2、p3之中有一个实例率先改变状态,p的状态就跟着改变。那个率先改变的 Promise 实例的返回值,就传递给p的回调函数。
  • 参数、catch规则同Promise.all

Promise.resolve

将现有对象转为Promise对象。

1. 参数

  • 参数为promise实例:原封不动的返回这个实例。
  • 参数为thenable对象:将它转为promise对象,然后立即执行它的then方法
  • 参数不是thenable对象,或者是一个原始值:返回一个新的promise对象,状态为resolved
  • 没有参数:直接返回衣蛾resolved状态的promise对象

Promise.reject

返回一个状态为rejected的promise实例

Promise.reject()方法的参数,会原封不动地作为reject的理由,变成后续方法的参数

const thenable = {
 then(resolve, reject) {
  reject('error');
 }
};

Promise.reject(thenable)
.catch(e => {
 console.log(e === thenable)
})
// true e并不是'error'

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • js实现继承的5种方式

    js实现继承的5种方式

    这篇文章主要介绍了js实现继承的5种方式,具体分析了JavaScript对象冒充、call()方法方式、apply()方法方式、原型链方式及混合方式的具体使用技巧,需要的朋友可以参考下
    2015-12-12
  • JavaScript实现简易加法计算器

    JavaScript实现简易加法计算器

    这篇文章主要介绍了JavaScript实现简易加法计算器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-03-03
  • 详解javascript立即执行函数表达式IIFE

    详解javascript立即执行函数表达式IIFE

    本文主要介绍了javascript立即执行函数表达式IIFE的相关知识。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • JavaScript遍历DOM元素的常见方式示例

    JavaScript遍历DOM元素的常见方式示例

    这篇文章主要介绍了JavaScript遍历DOM元素的常见方式,涉及javascript中firstChild、lastChild、firstElementChild、nextElementSibling等函数遍历dom元素相关使用技巧,需要的朋友可以参考下
    2019-02-02
  • js获取当前月的第一天和最后一天的小例子

    js获取当前月的第一天和最后一天的小例子

    这篇文章主要介绍了js获取当前月的第一天和最后一天的小例子,有需要的朋友可以参考一下
    2013-11-11
  • 原生JS实现手动轮播图效果实例代码

    原生JS实现手动轮播图效果实例代码

    手动轮播图,为轮播图中的一种,轮播图主要有无缝轮播,手动轮播,延迟轮播,切换轮播等等,轮播图主要用于展现图片,新出商品,词条,又能美观网页。給网页中增加动态效果。接下来通过本文给大家分享原生JS实现手动轮播图的实例代码,一起看看吧
    2018-11-11
  • 三种带箭头提示框总结实例

    三种带箭头提示框总结实例

    这篇文章主要介绍了三种带箭头提示框总结实例 的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-06-06
  • JS实现的自定义网页拖动类

    JS实现的自定义网页拖动类

    这篇文章主要介绍了JS实现的自定义网页拖动类,涉及页面元素响应鼠标事件动态改变属性的相关实现技巧,需要的朋友可以参考下
    2015-11-11
  • javascript游戏开发之《三国志曹操传》零部件开发(三)情景对话中仿打字机输出文字

    javascript游戏开发之《三国志曹操传》零部件开发(三)情景对话中仿打字机输出文字

    前两讲我告诉了大家如何使人物移动,那么今天我们就来看看如何实现仿《三国志曹操传》人物情景对话,感兴趣的朋友可以了解下,希望本文对你有所帮助
    2013-01-01
  • 用svg制作富有动态的tooltip

    用svg制作富有动态的tooltip

    这篇文章主要介绍了用svg制作富有动态的tooltip的代码以及制作过程,十分的细致全面,有需要的小伙伴可以参考下。
    2015-07-07

最新评论