Promise的介绍

136 阅读2分钟

一、Promise的相关介绍

Promise是解决异步问题的一种解决方案(但是它本身不是异步的),可以将异步操作队列化,可以按照自己想要的顺序执行这些异步操作。

  1. Promise的基本语法:

    Promise的构造函数可以传两个参数resolve和reject,如果成功,则调用 resolve,它把promise的状态修改为fullfiled。失败则调用 reject,他把promise的状态修改为rejected。通过.then获取成功的结果或者通过.catch获取失败的结果。

    示例代码:

    let r = new Promise((resolve, reject) => {
          let money = +prompt('请输入月薪')
          if (money >= 100000) {
            // 表示此时成功——》调用resolve,传入成功的结果
            resolve('如愿以偿')
          } else {
            // 表示此时失败了——》调用reject,传入失败的结果
            reject('继续加油')
          }
        })
         //拿到结果
        r.then((res) => {
          console.log(res)
        }).catch((err) => {
          console.log(err)
        })
    
    
  2. promise的链式编程:如果上一个 .then 中返回了一个新的 promise 对象, 则可以交给下一个 .then 继续处理。

    比如:通过代码需要输出一个需求为1s后控制台打印一个“六”,再过2s后控制台打印“三”,再过3秒后控制台打印“一”,代码如下:

    // 封装创建promise实例的函数
        function fn(txt, time) {
          return new Promise((resolve, reject) => {
            setTimeout(function () {
              resolve(txt)
            }, time)
          })
        }
    
        fn('六', 1)
          .then(res => {
            console.log(res)
            return fn('三', 2000)
          })
          .then(res => {
            console.log(res)
            return fn('一', 3000)
          })
          .then(res => {
            console.log(res)
          })
    
  3. Promise的三种状态:pending(默认状态)、fulfilled(成功状态)、rejected(失败状态),pending是默认状态,也就是初始状态,而fulfille的成功状态或rejected的失败状态,一旦确认,就会状态凝固,不会出现一个Promise既是成功状态又是失败状态,只能有一种结果。

  4. Promise有两种机制:

  • 等待机制:发起并行的promise异步操作,会等很多异步操作都执行完成了,再执行后面的代码

    语法:Promise.all([ promise1, promise2, ... ]).then( ... )
    

    使用场景: 当页面需要发送很多的接口请求来渲染页面等操作时,用Promise.all的话,可以等全部网络请 求接受完毕之后再渲染页面,这样用户看到的界面就是完整的,有效的提升用户的体验感。

  • 赛跑机制:发起并行的promise异步操作,会有很多的异步操作,里面的异步操作一旦有一个先执行完毕,也就不等其他的异步操作完成,直接执行后面的代码。

    语法:Promise.race([ promise1, promise2, ... ]).then( ... )
    

    使用场景: 把异步操作和定时器放到一起,如果定时器先触发,认为超时,告知用户