Promise

1.异步
1.1JavaScript的执行环境是「单线程」
1.2.所谓单线程,是指JS引擎中负责解释和执行JavaScript代码的线程只有一个,也就是一次只能完成一项任务,这个任务执行完后才能执行下一个,它会「阻塞」其他任务。这个任务可称为主线程
1.3.异步模式可以一起执行多个任务
1.4.JS中常见的异步调用
定时任何
ajax
事件函数

2.promise
主要解决异步深层嵌套的问题
promise 提供了简洁的API 使得异步操作更加容易

3.回调地狱的问题

  $.ajax({
      url: 'http://localhost:3000/data',
      success: function(data) {
        console.log(data)
        $.ajax({
          url: 'http://localhost:3000/data1',
          success: function(data) {
            console.log(data)
            $.ajax({
              url: 'http://localhost:3000/data2',
              success: function(data) {
                console.log(data)
              }
            });
          }
        });
      }
    });

4.Promise基本使用

<script type="text/javascript">
    // console.log(typeof Promise)
    // console.dir(Promise);

    var p = new Promise(function(resolve, reject){
      // 这里用于实现异步任务
      setTimeout(function(){
        var flag = false;
        if(flag) {
          // 正常情况
          resolve('hello');
        }else{
          // 异常情况
          reject('出错了');
        }
      }, 100);
    });
    p.then(function(data){
      console.log(data)
    },function(info){
      console.log(info)
    });

5.基于Promise发送Ajax请求

function queryData(url) {
  var p = new Promise(function (resolve, reject) {
    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function () {
      if (xhr.readyState != 4) return;
      if (xhr.readyState == 4 && xhr.status == 200) {
        // 处理正常的情况
        resolve(xhr.responseText);
      } else {
        // 处理异常情况
        reject("服务器错误");
      }
    };
    xhr.open("get", url);
    xhr.send(null);
  });
  return p;
}

// 发送多个ajax请求并且保证顺序
queryData("http://localhost:3000/data")
  .then(function (data) {
    console.log(data);
    return queryData("http://localhost:3000/data1");
  })
  .then(function (data) {
    console.log(data);
    return queryData("http://localhost:3000/data2");
  })
  .then(function (data) {
    console.log(data);
  });

6.then参数中的函数返回值

function queryData(url) {
  return new Promise(function (resolve, reject) {
    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function () {
      if (xhr.readyState != 4) return;
      if (xhr.readyState == 4 && xhr.status == 200) {
        // 处理正常的情况
        resolve(xhr.responseText);
      } else {
        // 处理异常情况
        reject("服务器错误");
      }
    };
    xhr.open("get", url);
    xhr.send(null);
  });
}
queryData("http://localhost:3000/data")
  .then(function (data) {
    return queryData("http://localhost:3000/data1");
  })
  .then(function (data) {
    return new Promise(function (resolve, reject) {
      setTimeout(function () {
        resolve(123);
      }, 1000);
    });
  })
  .then(function (data) {
    return "hello";
  })
  .then(function (data) {
    console.log(data);
  });

7.Promise常用API-实例方法

    function foo() {
      return new Promise(function(resolve, reject){
        setTimeout(function(){
          // resolve(123);
          reject('error');
        }, 100);
      })
    }
    
	foo()
	  .then(function (data) {
	    console.log(data);
	  })
	  .catch(function (data) {
	    console.log(data);
	  })
	  .finally(function () {
	    console.log("finished");
	  });

    // 两种写法是等效的
    foo()
      .then(function(data){
        console.log(data)
      },function(data){
        console.log(data)
      })
      .finally(function(){
        console.log('finished')
      });

8.Promise常用API-对象方法

 function queryData(url) {
        return new Promise(function(resolve, reject){
          var xhr = new XMLHttpRequest();
          xhr.onreadystatechange = function(){
            if(xhr.readyState != 4) return;
            if(xhr.readyState == 4 && xhr.status == 200) {
              // 处理正常的情况
              resolve(xhr.responseText);
            }else{
              // 处理异常情况
              reject('服务器错误');
            }
          };
          xhr.open('get', url);
          xhr.send(null);
        });
      }
  
      var p1 = queryData('http://localhost:3000/a1');
      var p2 = queryData('http://localhost:3000/a2');
      var p3 = queryData('http://localhost:3000/a3');
      // Promise.all([p1,p2,p3]).then(function(result){
      //   console.log(result)
      // })
      Promise.race([p1,p2,p3]).then(function(result){
        console.log(result)
      })

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值