promise定义及其用法

一.promise

promise 异步编程的解决方案
    多次ajax请求,并且需要严格的按照顺序执行
    A B C 三个接口
    //一层层的回调函数嵌套,形成回调地狱

    ajax({
        success:function(){
            ajax({
                success:function(){
                    ajax({

                    })
                }
            })
        }
    })
    ajax();
    ajax();
    ajax();

   
<script>
      //类 Promise
      //三种状态 两种变化形式 pending -> fullfilled  pending->rejected 一旦状态发生改变,就不再变化了

      let promise = new Promise(function (resolve, reject) {
        resolve();//成功的状态
        reject();//失败的状态
      });
      promise.then(
        function () {
          console.log("成功了");
        },
        function () {
          console.log("失败了");
        }
      );

      let p1 = new Promise((resolve, reject) => {
        //放异步操作
        setTimeout(function () {
          resolve();
        }, 3000);
      });
      p1.then(function () {
        console.log("开始");
      });
      //*********************************
      setTimeout(function () {
        console.log("开始");
        setTimeout(function () {
          console.log("进行");
          setTimeout(function () {
            console.log("完成");
          }, 1000);
        }, 800);
      }, 3000);

      //*********************************
       let p1 = new Promise((resolve, reject) => {
        setTimeout(() => {
          resolve();
        }, 3000);
      });
      p1.then(() => {
        console.log("开始");

        return new Promise((resolve, reject) => {
          setTimeout(() => {
            resolve();
          }, 800);
        });
      })
        .then(() => {
          console.log("进行");
          return new Promise((resolve, reject) => {
            setTimeout(() => {
              resolve();
            }, 1000);
          });
        })
        .then(() => {
          console.log("完成");
        });

        //****************************************
      function timeout(time) {
        return new Promise((resolve, reject) => {
          setTimeout(resolve, time);
        });
      }

      timeout(3000)
        .then(() => {
          console.log("开始");
          return timeout(800);
        })
        .then(() => {
          console.log("进行");
          return timeout(1000);
        })
        .then(() => {
          console.log("完成");
        });

      //给then方法传递数据********************************

      let promise = new Promise(function (resolve, reject) {
        //resolve(11); //成功的状态
        reject("没有眼缘"); //失败的状态
      });

      promise.then(
        (data) => {
          console.log(data);
        },
        (data) => {
          console.log(data);
        }
      );
    </script>

二.结合promise封装一个基础的ajax

html

<body>
    <script src="ajax.js"></script>
    <script>
      ajax("data1.json")
        .then((data) => {
          console.log(data);

          return ajax("data2.json");
        })
        .then((data) => {
          console.log(data);
        });
    </script>

ajax.js

function ajax(url) {
  return new Promise((resolve, reject) => {
    if (window.XMLHttpRequest) {
      var xhr = new XMLHttpRequest();
    } else {
      var xhr = new ActiveXObject("Microsoft.XMLHTTP");
    }

    xhr.open("get", url);
    xhr.send();
    xhr.onreadystatechange = function () {
      if (xhr.readyState == 4) {
        if (xhr.status == 200) {
          var data = xhr.responseText;
          resolve(data);
        } else {
          reject();
        }
      }
    };
  });
}

三.promise其他的一些方法

<script>
      /* let promise = new Promise(function (resolve, reject) {
        //resolve(); //成功的状态
        reject(); //失败的状态
      });
      promise
        .then(() => {
          console.log("成功");
        })
        .catch(() => {
          console.log("失败");
        }); */

      //all  race  是类方法  Promise
      let p1 = new Promise((resolve, reject) => {
        setTimeout(() => {
          resolve();
        }, 1000);
      });
      let p2 = new Promise((resolve, reject) => {
        setTimeout(() => {
          resolve();
        }, 5000);
      });
      //all 所有的异步操作都完成之后,再执行相应的代码,以时间最长的为准
      Promise.all([p1, p2]).then(() => {
        console.log("all-----");
      });
      //all 只要有一个异步操作完成之后,就执行相应的代码,以时间最短的为准
      Promise.race([p1, p2]).then(() => {
        console.log("race*****");
      });
    </script>
Promise 是一种用于异步编程的技术,它可以让我们更方便地处理异步操作的结果。在 JavaScript 中,Promise 通常有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。我们可以使用 then() 方法来处理 Promise 的结果,或者使用 catch() 方法来处理 Promise 的错误。 下面是一个 Promise 的使用示例: ``` function fetchData() { return new Promise((resolve, reject) => { // 异步操作 setTimeout(() => { const data = { name: 'John', age: 30 }; resolve(data); }, 2000); }); } fetchData() .then(data => { console.log(data); }) .catch(error => { console.error(error); }); ``` 在上面的代码中,我们定义了一个 fetchData() 函数,它返回一个 Promise 对象。在 Promise 的构造函数中,我们执行了一个异步操作,即延迟 2 秒后返回一个数据对象。如果异步操作成功,我们调用 resolve() 方法并传入数据对象;如果异步操作失败,我们调用 reject() 方法并传入错误对象。 在调用 fetchData() 函数后,我们使用 then() 方法来处理 Promise 的结果。如果 Promise 成功,then() 方法会接收到 resolve() 方法传入的数据对象,并将其作为参数传递给回调函数。如果 Promise 失败,catch() 方法会接收到 reject() 方法传入的错误对象,并将其作为参数传递给回调函数。 至于 Promise 的代码实现,可以参考 Promise/A+ 规范,或者使用现有的 Promise 库,比如 Bluebird、Q 等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值