zoukankan      html  css  js  c++  java
  • es6中Promise多个then的使用方法

    promise是构造函数 一般打印大写的就是构造函数,所以用new 得到一个promise实例

    promise是为了解决回调地狱问题的。回调地狱就是ajax一层套一层 特别多

    then方法是在promise构造函数的prototype属性上,所以说,只要是promise创建的实力,都可以访问到then方法

    promise表示一个异步操作,每当我们new一个promise实例,这个实例就表示一个具体的异步操作

    既然他是异步操作,所以异步操作结果只能有两种状态 成功和失败

    异步操作无法使用return把结果返回给调用者,只能使用回调函数的形式,将结果返回给调用者

    应用场景:

    我们有一个A方法ajax方法获得用户信息,我们还有一个B方法是马上要使用用户信息,当两个方法同时调用时候,我们无法判别B方法已经拿到A方法的ajax获取的用户信息,基于这样的需求,我们急需一个能让他们按照A->B的顺序同步执行的东西。

    解决办法:

    es6的Promise对象是可以实现同步操作的,这解决了ajax请求想同步按照顺序执行的问题。

    在后面每个then的时候,我们需要返回Promise对象才可以一直then调用,我们可以直接

    return new Promise(response => {
       response({ name: "第2个传的值" })
    });

    也可以使用Promise提供的方法

     return Promise.resolve({ name: "第3个传的值" });

    使用return new Promise方式无限调用then:

    new Promise((resolve, reject) => {
        console.log(1)
        resolve({
            name: "第1个传递的值"
        });
    }).then((result) => {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                console.log(2, result)
                resolve({
                    name: "第2个传递的值"
                })
            }, 1000)
        })
    }).then((result) => {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                console.log(3, result)
                resolve({
                    name: "第3个传递的值"
                })
            }, 1000)
        })
    }).then((result) => {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                console.log(4, result)
                resolve({
                    name: "第4个传递的值"
                })
            }, 1000)
        })
    }).then((result) => {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                console.log(5, result)
            }, 1000)
        })
    })

     除了上面的方式,还可以使用promise.all方法来实现:

    var p1 = new Promise((resolve, reject) => {
          console.log(1)
          resolve()
        })
        var p2 = new Promise((resolve, reject) => {
          setTimeout(() => {
            console.log(2)
            resolve()
          }, 1000);
        })
        var p3 = new Promise((resolve, reject) => {
          setTimeout(() => {
            console.log(3)
            resolve()
          }, 1000);
        })
     
        Promise.all([p1, p2, p3]).then((result) => {
          console.log("执行完毕");
        })
    1. var p1 = new Promise((resolve, reject) => {
    2.  
      console.log(1)
    3.  
      resolve()
    4.  
      })
    5.  
      var p2 = new Promise((resolve, reject) => {
    6.  
      setTimeout(() => {
    7.  
      console.log(2)
    8.  
      resolve()
    9.  
      }, 1000);
    10.  
      })
    11.  
      var p3 = new Promise((resolve, reject) => {
    12.  
      setTimeout(() => {
    13.  
      console.log(3)
    14.  
      resolve()
    15.  
      }, 1000);
    16.  
      })
    17.  
       
    18.  
      Promise.all([p1, p2, p3]).then((result) => {
    19.  
      console.log("执行完毕");
    20.  
      })
  • 相关阅读:
    利用AspNetPager控件实现数据分页(存储过程)
    System.Reflection
    规范管理提高效率——国内主要api接口文档工具盘点
    文件管理命令
    操作系统磁盘分区
    实体类配置(Entity)
    SpEL语法
    杂乱无章
    从struts2源码学到的技巧
    Spring基于注解的缓存配置
  • 原文地址:https://www.cnblogs.com/yaoling/p/14053225.html
Copyright © 2011-2022 走看看