• 饮冰三年-人工智能-Vue-70 Promise


    上一篇 饮冰三年-人工智能-Vue-69 路由

    五、Promise

    1、认识Promise

    Promise到底是做什么的呢?

    Promise是ES6中一个非常重要和好用的特性,是异步编程的一种解决方案。

    我们来考虑下面的场景(有夸张的成分):

    1. 我们需要通过一个url1从服务器加载一个数据data1,data1中包含了下一个请求的url2
    2. 我们需要通过data1取出url2,从服务器加载数据data2,data2中包含了下一个请求的url3
    3. 我们需要通过data2取出url3,从服务器加载数据data3,data3中包含了下一个请求的url4
    4. 发送网络请求url4,获取最终的数据data4

     上面的代码有什么问题吗?不够优雅!Promise可以以一种非常优雅的方式来解决这个问题。

    2、Promise的使用

    01-Promise的基本使用

    这里,我们用一个定时器来模拟异步事件。

    假设下面的result是从网络上1秒后请求的结果,根据结果的不同我们采取不同额处理方式 

    new Promise((resolve, reject) => {
      setTimeout(function () {
        let result = false;
        if (result == true) {
          resolve("网络数据返回数据为true");
        } else {
          reject("网络数据返回为false");
        }
      }, 1000);
    })
      .then((data) => {
        console.log(data);
      })
      .catch((data) => {
        console.log(data);
      });
    View Code

    02-Promise三种状态

    异步操作之后会有三种状态

    1. pending:等待状态,比如正在进行网络请求,或者定时器没有到时间。
    2. fulfill:满足状态,当我们主动回调了resolve时,就处于该状态,并且会回调.then()
    3. reject:拒绝状态,当我们主动回调了reject时,就处于该状态,并且会回调.catch()

    03-Promise的另外处理形式

     

    04-Promise的处理多次回调形式

    /*
    我们需要通过一个url1从服务器加载一个数据data1,data1中包含了下一个请求的url2
    我们需要通过data1取出url2,从服务器加载数据data2,data2中包含了下一个请求的url3
    我们需要通过data2取出url3,从服务器加载数据data3,data3中包含了下一个请求的url4
    发送网络请求url4,获取最终的数据data4 
    */
    new Promise((resolve, reject) => {
      setTimeout(function () {
        let data1 = {
          url2: "www.baidu.com",
          msg: "通过一个url1从服务器加载一个数据data1",
        };
        resolve(data1);
      }, 1000);
    }).then(
      (data) => {
        console.log("我们通过data1取出url2: " + data.url2);
        new Promise((resolve, reject) => {
          setTimeout(function () {
            let data2 = {
              url3: "www.qq.com",
            };
            resolve(data2);
          }, 1000);
        }).then(
          (data) => {
            console.log("我们通过data2取出url3: " + data.url3);
            new Promise((resolve, reject) => {
              setTimeout(function () {
                let data3 = {
                  url4: "www.cnblogs.com",
                };
                resolve(data3);
              }, 1000);
            }).then((data) => {
              console.log("我们通过data3取出url4: " + data.url4);
              new Promise((resolve, reject) => {
                setTimeout(function () {
                  let data4 = {
                    msg: "我是data4中的数据",
                  };
                  resolve(data4);
                }, 1000);
              }).then((data) => {
                console.log(data.msg);
              });
            });
          }
        );
      },
      (error) => {
        console.log(error);
      }
    );
    1.0版本

     

    /*
    我们需要通过一个url1从服务器加载一个数据data1,data1中包含了下一个请求的url2
    我们需要通过data1取出url2,从服务器加载数据data2,data2中包含了下一个请求的url3
    我们需要通过data2取出url3,从服务器加载数据data3,data3中包含了下一个请求的url4
    发送网络请求url4,获取最终的数据data4 
    */
    new Promise((resolve, reject) => {
      setTimeout(function () {
        let data1 = {
          url2: "www.baidu.com",
          msg: "通过一个url1从服务器加载一个数据data1",
        };
        resolve(data1);
      }, 1000);
    })
      .then(
        (data) => {
          console.log("我们通过data1取出url2: " + data.url2);
          return new Promise((resolve, reject) => {
            setTimeout(function () {
              let data2 = {
                url3: "www.qq.com",
              };
              resolve(data2);
            }, 1000);
          });
        },
        (error) => {
          console.log(error);
        }
      )
      .then((data) => {
        console.log("我们通过data2取出url3: " + data.url3);
        return new Promise((resolve, reject) => {
          setTimeout(function () {
            let data3 = {
              url4: "www.cnblogs.com",
            };
            resolve(data3);
          }, 1000);
        });
      })
      .then((data) => {
        console.log("我们通过data3取出url4: " + data.url4);
        let data4 = {
          msg: "我是data4中的数据",
        };
        return Promise.resolve(data4);
      })
      .then((data) => {
        console.log(data.msg);
      });
    2.0版本

     

    3.0 版本的简写

     

    05-Promise的all方法使用

    Promise.all([
      new Promise((resolve, reject) => {
        setTimeout(function () {
          resolve({name:"yango",age:20});
        }, 2000);
      }),
      new Promise((resolve, reject) => {
        setTimeout(function () {
          resolve({name:"yangke",age:21});
        }, 1000);
      }),
    ]).then(results=>{
      console.log(results);
    });
    View Code

     下一篇:饮冰三年-人工智能-Vue-71 Vuex

  • 相关阅读:
    [你必须知道的异步编程]C# 5.0 新特性——Async和Await使异步编程更简单
    [C# 开发技巧系列]使用C#操作Word和Excel程序
    全面解析C#中参数传递
    VSTO之旅系列(四):创建Word解决方案
    [C# 开发技巧系列] 使用C#操作幻灯片
    VSTO之旅系列(五):创建Outlook解决方案
    [C# 开发技巧系列]C#如何实现图片查看器
    [你必须知道的异步编程]——异步编程模型(APM)
    [你必须知道的异步编程]——基于任务的异步模式
    [C# 开发技巧系列]如何动态设置屏幕分辨率
  • 原文地址:https://www.cnblogs.com/YK2012/p/14940163.html
Copyright © 2020-2023  润新知