一文玩转天行数据+ES6的Promise(从创建到实例和对象的方法,满足面试官的想法)

158 阅读2分钟

一,什么是Promise?

Promise是异步任务的终极解决方案,Promise解决异步任务可以完美解决回调地狱问题

二,Promise的三种状态

Promise 必须为以下三种状态之一:等待态(Pending)执行态(Fulfilled)拒绝态(Rejected)

一旦Promise 被 resolvereject,不能再迁移至其他任何状态(即状态 immutable)。

三,Promise的基本过程

1. 初始化 Promise 状态(pending)

2. 立即执行 Promise 中传入的 fn 函数,将Promise 内部 resolve、reject 函数作为参数传递给 fn ,按事件机制时机处理

3. 执行 then(..) 注册回调处理数组(then 方法可被同一个 promise 调用多次

四,从回调地狱开始(冗余-->后面有解决办法)

$.ajax({
            url: 'http://api.tianapi.com/duilian/index?key=1e6ecc58567a22475e459cfac3b00413',
            success: function(data) {
                // console.log(data);
                ret = data;
                console.log(ret); //这个是data中的数据
                $.ajax({
                    url: 'http://api.tianapi.com/zmsc/index?key=1e6ecc58567a22475e459cfac3b00413',
                    success: function(data1) {
                        console.log(data1);
                        $.ajax({
                            url: 'http://api.tianapi.com/pyqwenan/index?key=1e6ecc58567a22475e459cfac3b00413',
                            success: function(data2) {
                                console.log(data2);
                            }
                        })
                    }
                })
            }
        })

五,Promise基本使用

  • 实例化Promise对象,构造函数中传递参数,该函数中用于处理异步任务
  • resolve 和 reject 两个参数用于处理成功和失败两种情况,并通过p.then获取处理结果
语法格式:
   var p = new Promise(function(resolve,reject){
         //成功时调用:resolve()
         //失败时调用:reject()
      });
   p.then(function(ret){
        //从resolve得到的正常结果,
   },function(ret){
       //从reject得到错误的消息
   });
var p = new Promise(function(resolve, reject) {
            //这里用于实现异步任务
            setTimeout(function() {
                var flag = true;
                if (flag) {
                    resolve('成功');
                } else {
                    reject('失败');
                }
            }, 1000)
        });
        p.then(function(data) {
            console.log(data);
        }, function(info) {
            console.log(info);
        });

六,基于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;
        }
        QueryData('http://api.tianapi.com/esports/index?key=1e6ecc58567a22475e459cfac3b00413&num=10')
            .then(function(data) {
                console.log(data);
            }, function(info) {
                console.log(info);
        })

七,发送多个Ajax请求,保证顺序,解决回调地狱

QueryData('http://api.tianapi.com/pyqwenan/index?key=1e6ecc58567a22475e459cfac3b00413')
      .then(function(data) {
                console.log(data)
     return QueryData('http://api.tianapi.com/esports/index?key=1e6ecc58567a22475e459cfac3b00413&num=10');
            })
      .then(function(data) {
                console.log(data);
     return QueryData('http://api.tianapi.com/duilian/index?key=1e6ecc58567a22475e459cfac3b00413');
            })
      .then(function(data) {
      console.log(data);
            });

八,Promise的then方法参数中函数的返回值

    ①:返回Promise实例对象
       返回该实例对象会调用下一个then
    ②:返回普通值
       返回普通值会直接传递给下一个then,通过then参数中函数的参数接收该值

九,Promise常用API--->实例方法

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

十,Promise常用API--->对象方法

①:Promise.all()并发处理多个异步任务,所有任务执行完才能得到结果
          语法格式:
                Promise.all([p1,p2,p3]).then(return) =>{
                    console.log(result)
            })
②:Promise.race()并发处理多个异步任务,只要有一个任务完成就能得到结果
          语法格式:
                  Promise.race([p1,p2,p3]).then(return) =>{
                      console.log(result)
            })
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;
        }
        var p1 = QueryData('http://api.tianapi.com/tiangou/index?key=1e6ecc58567a22475e459cfac3b00413')
        var p2 = QueryData('http://api.tianapi.com/esports/index?key=1e6ecc58567a22475e459cfac3b00413&num=10')
        var p3 = QueryData('http://api.tianapi.com/zmsc/index?key=1e6ecc58567a22475e459cfac3b00413')
            // Promise.all([p1, p2, p3]).then(function(result) {
            //     console.log(result);
            // })
        Promise.race([p1, p2, p3]).then(function(result) {
            console.log(result);
        })