首页 > 技术文章 > vue Promise

limu-zy 2020-12-19 16:04 原文

Promise

Promise是ES6引入专门用来解决异步的

异步调用

  • 异步效果分析
  1. 定时任务
  2. Ajax
  3. 事件函数
  • 多次异步调用的依赖分析
    • 多次异步调用的结果顺序不确定
    • 异步调用结果如果存在依赖需要嵌套(如果嵌套过多,会造成回调地狱)

Promise概述

Promise是异步编程的一种解决方案,从语法上来说,Promise是一个对象,从它可以获取异步操作的消息

使用promise主要有以下两个好处:

  • 可以避免多层异步调用嵌套问题(回调地狱)
  • Promise对象提供了简洁的API,使得控制异步操作更加容易

Promise基本语法

实例化Promise对象,构造函数中传递函数,该函数中用于处理异步任务

resolve和reject两个参数用于处理陈宫和失败两种情况,并通过p.path获取处理的结果

var p = new Promise(function(resolve,reject){
  //成功时调用resolve()
  //失败时调用reject()
});
p.path(function(ret){
  //从resolve得到正常结果
},function(ret){
  //从reject得到错误信息
});

基于Promise处理Ajax请求

处理原生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);
      });
    }

1、单次请求

queryData(url)
      .then(function(data){
        console.log(data);
      },function(info){
        console.log(info)
      });

2、发送多次ajax请求

    queryData()
      .then(function(data){
        console.log(data)
        return queryData();
      })
      .then(function(data){
        console.log(data);
        return queryData();
      })
      .then(function(data){
        console.log(data)
      });

then参数中饿的函数返回值

1、返回Promise实例对象

  • 返回的该实例对象会调用下一个then

2、返回普通值

  • 返回的普通纸会直接传递给下一个then,通过then参数中的函数接受该值

Promise常用的API

实例方法

  • p.path() 得到异步任务的正确结果
  • p.catch() 获取异常信息
  • p.finally() 成功与否都会执行(尚且不是正式标准)
queryData()
  .then(function(data){
    console.log(data);
  })
  .catch(function(data){
    console.log(data);
  })
  .finally(function(){
    console.log('finished');
  })

对象方法

  • Promise.all() 并发处理多个异步任务,所有任务都执行完成才得到结果
  • Promise.race()并发处理多个异步任务,只要一个任务都执行完成就能得到结果
Promise.all([p1,p2,p3]).then((result) => {
  console.log(result)
}) 
Promise.race([p1,p2,p3]).then((result) => {
  console.log(result)
}) 
 

 

推荐阅读