zoukankan      html  css  js  c++  java
  • Promise

    Promise构造函数接受一个函数作为参数,该函数有两个参数:

    resolve:把状态改为fulfilled,结果为result

    reject:把状态改为rejected,结果为error

    工作原理:

      在执行new Promise对象的时候,这个对象有个状态pending,Promise结果为undefined,而resolve和reject可以改变对象的状态

    then方法(为 Promise 实例添加状态改变时的回调函数)

    Promise原型上的方法,可以接受两个参数

    onFulfilled(function) 必须  对应Promise对象的resolve方法,如果该参数不是函数,则会在内部被替换为 (x) => x,即原样返回 promise 最终结果的函数

    onRejected(function) 可选  对应Promise对象的reject方法,如果该参数不是函数,则会在内部被替换为一个 "Thrower" 函数

    ,返回新的Promise实例。

    当一个 Promise 完成(fulfilled)或者失败(rejected)时,返回函数将被异步调用(由当前的线程循环来调度完成)。具体的返回值依据以下规则返回。如果 then 中的回调函数

    • 返回了一个值,那么 then 返回的 Promise 将会成为接受状态,并且将返回的值作为接受状态的回调函数的参数值。
    • 没有返回任何值,那么 then 返回的 Promise 将会成为接受状态,并且该接受状态的回调函数的参数值为 undefined
    • 抛出一个错误,那么 then 返回的 Promise 将会成为拒绝状态,并且将抛出的错误作为拒绝状态的回调函数的参数值。
    • 返回一个已经是接受状态的 Promise,那么 then 返回的 Promise 也会成为接受状态,并且将那个 Promise 的接受状态的回调函数的参数值作为该被返回的Promise的接受状态回调函数的参数值。
    • 返回一个已经是拒绝状态的 Promise,那么 then 返回的 Promise 也会成为拒绝状态,并且将那个 Promise 的拒绝状态的回调函数的参数值作为该被返回的Promise的拒绝状态回调函数的参数值。
    • 返回一个未定状态(pending)的 Promise,那么 then 返回 Promise 的状态也是未定的,并且它的终态与那个 Promise 的终态相同;同时,它变为终态时调用的回调函数参数与那个 Promise 变为终态时的回调函数的参数是相同的。
    let delay = (time) => {
      return new Promise((resolve, reject) => {
        if (time > 3) {
          reject(new Error('fail'))
        } else {
          setTimeout(() => {
            resolve()
          }, time * 1000)
        }
      })
    }
    
    delay(1)
      .then(() => {
        return 1
      }, () => {
        return delay(2)
      })
      .then((num) => {
        console.log(`params: ${num}`)
        return delay(4)
      })
      .then((num) => {
        console.log(3)
      }, () => {
        console.log(4)
      })
    
    params: 1
    4

    catch方法

    Promise对象上的方法,用来捕获链式操作上reject抛出的异常,避免每次都在then里写onRejected

    不能用throw来抛出异常,必须要用reject(可以改变Promise状态)

    Promise的个静态方法(应用场景:有时期望返回一个值/报错信息也能用Promise实例的方法)

    resolve和reject

    let getSettings = () => {
      let settings = localStorage.getItem('settings')
      if (settings) {
        return Promise.resolve(settings)
      } else {
        return new Promise((resolve, reject) => {}) // 假如是异步操作
      }
    }
    
    localStorage.setItem('settings', '1')
    
    getSettings()
      .then(settings => {
        console.log(settings)
      })
    
    1

    all静态方法(场景:多个请求互不关联,但都需要请求)

    返回一个 Promise 实例,等待所有都完成(或第一个失败),如果参数中  promise 有一个失败(rejected),此实例回调失败(reject),失败的原因是第一个失败 promise 的结果。

    let a1 = new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve()
      }, 1000)
    })
    
    let b1 = Promise.resolve(1)
    
    Promise.all([a1, b1])
      .then(_ => {
        console.log(_)
      })
    
    Array [ undefined, 1 ]

    race静态方法(场景:多个请求,请求相同内容的资源,一个响应成功就结束)

    返回一个 promise,一旦迭代器中的某个promise解决或拒绝,返回的 promise就会解决或拒绝。

    let a1= new Promise(resolve => {
      setTimeout(resolve, 1000, 'a')
    })
    
    let b1 = new Promise(resolve => {
      setTimeout(resolve, 500, 'b')
    })
    
    Promise.race([a1, b1])
      .then(_ => {
        console.log(_)
      })
    
    b
  • 相关阅读:
    P5362 [SDOI2019]连续子序列 思维题
    P5360 [SDOI2019]世界地图 虚树+最小生成树
    P4565 [CTSC2018]暴力写挂 边分治+虚树
    BZOJ2870. 最长道路tree 并查集/边分治
    P4103 [HEOI2014]大工程 虚树
    P4220 [WC2018]通道 虚树+边分治
    P3261 [JLOI2015]城池攻占 可并堆
    积水问题
    23. 合并K个排序链表
    21. 合并两个有序链表
  • 原文地址:https://www.cnblogs.com/allenzhang-920/p/13031827.html
Copyright © 2011-2022 走看看