写点什么

Promise

作者:Jason199
  • 2022 年 7 月 05 日
  • 本文字数:2656 字

    阅读完需:约 9 分钟

Promise

今天我们来讲一下 js 里面的重要函数 promise

Promise

承诺多少个状态

          持续  pending

          成功  resolved

          失败  rejected

        ES6 的语法

          专门用来解决回调地域问题


Promise 的语法

        Promise 是 ES6 内置的构造函数

        使用方法: new Promise(function () { 你要执行的异步的事情 })

          实例化的时候, 这个函数接收两个参数

          resolve, reject

        使用方法:

          实例化对象身上由两个方法

1. then()

            promise 对象.then(function () {})

初始化 Promise 时,执行器函数改变了 Promise 的状态。执行器函数同步执行。异步操作返回的数据(成功的值和失败的原因)可以交给.then 处理,为 Promise 实例提供处理程序。

Promise 实例生成以后,可以用 then 方法分别指定 resolved 状态rejected 状态的回调函数。这两个函数 onFulfilled,onRejected 都是可选的,不一定要提供。如果提供,则会 Promise 分别进入 resolved 状态rejected 状态时执行。

而且任何传给 then 方法的非函数类型参数都会被静默忽略

then 方法必须返回一个新的 promise 对象

2. catch()

            promise 对象.catch(function () {})

          then 方法的函数传递给了 实例化的 resolve

          catch 方法的函数传递给了 实例化的 reject

当第一个.then 的异常被捕获后可以继续执行。


 //1. promise 基础语法    const p = new Promise(function (resolve, reject) {      // resolve 是成功的回调函数      // 当你书写 resolve() 的时候, 实际上是在调用 then 里面的函数      // reject 是失败的回调函数      // 当你书写 reject() 的时候, 实际上是在调用 catch 里面的函数      ajax({        url: './server/a1.php',        dataType: 'json',        success (res) {          resolve(res)        },        error (err) {          reject(err)        }      })    })    调用 then 方法    调用 catch 方法    p.then(function (res) {      console.log('我执行了', res)    })    p.catch(function (err) {      console.log('我失败了', err)    // })
复制代码

3. Promise 的另一种语法

        Promise.all()

        目的是把多个 promise 对象封装成一个

        使用方法: Promise.all([ promise 对象 1, promise 对象 2, ... ]).then(function () {})

        then 里面会接收所有 promise 完成以后的结果, 以一个数组的形式给你返回

        致命缺点: 必须三个全部成功, 由任何一个失败, 那么最终你一个结果也得不到

//原生primose all();const p1 = Promise.resolve('p1')
const p2 = new Promise((resolve, reject) => { setTimeout(() => { resolve('p2 延时一秒') }, 1000)})
const p3 = new Promise((resolve, reject) => { setTimeout(() => { resolve('p3 延时两秒') }, 2000)})
const p4 = Promise.reject('p4 rejected')
const p5 = new Promise((resolve, reject) => { setTimeout(() => { reject('p5 rejected 延时1.5秒') }, 1500)})
// 所有Promise实例都成功Promise.all([p1, p2, p3]) .then(res => { console.log(res) }) .catch(err => console.log(err)) // 2秒后打印 [ 'p1', 'p2 延时一秒', 'p3 延时两秒' ] // 一个Promise实例失败Promise.all([p1, p2, p4]) .then(res => { console.log(res) }) .catch(err => console.log(err)) // p4 rejected // 一个延时失败的Promise Promise.all([p1, p2, p5]) .then(res => { console.log(res) }) .catch(err => console.log(err)) // 1.5秒后打印 p5 rejected // 两个Promise实例失败Promise.all([p1, p4, p5]) .then(res => { console.log(res) }) .catch(err => console.log(err)) // p4 rejected
复制代码

上述实例得到,all 的性质:

所有都成功,则合成 Promise 的返回值就是所有子 Promise 的返回值数组。

有一个失败,那么第一个失败的会把自己的理由作为合成 Promise 的失败理由。

Promise 的进阶语法

        当你在 promise 对象的 then 里面返回一个新的 promise 对象

        可以在这个 then 的后面继续来一个 then 接收第一个 then 里面 promise 对象的结果

改变封装异步代码的思路

        按照 promise 的思想来封装异步代码

        分析: 为什么可以使用 then

          得是一个 promise 对象

        封装:

          function pAjax() {}

          只要 pAjax 里面返回的是一个 promise 对象

          pAjax({ 配置项 }).then()

 //2. Promise 进阶语法    new Promise(function (resolve, reject) {      ajax({        url: './a.php',        dataType: 'json',        success (res) {          resolve(res)        }      })    })    .then(function (res) {      console.log('需求1: ', res)      return new Promise(function (resolve, reject) {        ajax({          url: './b.php',          data: res,          dataType: 'json',          success (res) {            resolve(res)          }        })      })    })    .then(function (res) {      console.log('需求2: ', res)      return new Promise(function (resolve, reject) {        ajax({          url: './c.php',          data: res,          dataType: 'json',          success (res) {            resolve(res)          }        })      })    })    .then(function (res) {      console.log('需求3: ', res)    })
复制代码

a.php

<?php  $arr = array(    "a" => 10,    "b" => 20  );  echo json_encode($arr);?>
复制代码

b.php

<?php  $a = $_GET['a'];  $b = $_GET['b'];  $arr = array(    "c" => $a + $b,    "d" => 5  );echo json_encode($arr);?>
复制代码

c.php

<?php  $c = $_GET['c'];  $d = $_GET['d'];  $arr = array(    "e" => $c * $d,    "message" => "到此为止"  ); echo json_encode($arr);?>
复制代码

结语

promise 作为前端中比较常用的构造函数之一 ,希望本篇文章能够帮助大家更好的理解 promise。


发布于: 刚刚阅读数: 3
用户头像

Jason199

关注

还未添加个人签名 2022.04.29 加入

一条努力上岸的咸鱼

评论

发布
暂无评论
Promise_Promise_Jason199_InfoQ写作社区