ES6之Promise封装ajax()

什么是异步?

  同步:一定要等任务执行完了,得到结果,才执行下一个任务。

  异步:不等任务执行完,直接执行下一个任务。

为什么要用promise?

  Promise的出现主要是解决地狱回调的问题,比如你需要结果需要请求很多个接口,这些接口的参数需要另外那个的接口返回的数据作为依赖,这样就需要我们一层嵌套一层,但是有了Promise 我们就无需嵌套

  Promise的本质就是分离了异步数据获取和业务逻辑

所有代码

Promise/A+规范

$.Ajax()中的promise

如果不使用promise,$.ajax请求的时候成功和失败的回调函数是写在参数里的,他是对象参数的一个值

$.ajax({
        method:"post",
        url:"/xxx",
        data:"username=mtt&password=1",
        dataType:‘json‘,
        success:()=>{}//成功后的回调函数
        error:()=>{}//失败后的回调函数
    }
    )

如果使用jQuery.axja()发送请求,并使用promise,代码如下

let myButton = document.getElementById(‘myButton‘);

function success(responseText){
    console.log("成功")
    console.log(responseText);//responseTex
}
function fail(request){
    console.log("失败")
    console.log(request);
}
myButton.addEventListener("click",(e)=>{
    //使用ajax
    $.ajax({
        method:"post",
        url:"/xxx",
        data:"username=mtt&password=1",
        dataType:‘json‘//预期服务器返回的数据类型,如果不写,就是响应里设置的
    }
    ).then(success,fail)//$.ajax()返回一个promise
})

$.ajax()函数会返回一个promise,然后在后面.then(success,fail)时候,如果成功了就会调用第一个参数里的函数即success函数,如果失败了就会调用第二个参数的函数即fail函数.

Promise的优点(1.语法上的简化):不用记住失败或者成功的函数名字.只需要知道成功是第一个参数,失败时第二个参数,比如:

   //使用ajax
    $.ajax({
        method:"post",
        url:"/xxx",
        data:"username=mtt&password=1",
        dataType:‘json‘//预期服务器返回的数据类型,如果不写,就是响应里设置的
    }
    ).then((responseText)=>{console.log(responseText)},()=>{console.log("失败")})//$.ajax()返回一个promise, 

Promise的优点(2.多次处理): .then(()=>{},()=>{})

$.ajax({
        method:"post",
        url:"/xxx",
        data:"username=mtt&password=1",
        dataType:‘json‘//预期服务器返回的数据类型,如果不写,就是响应里设置的
    }
    ).then((responseText)=>{
        console.log(responseText)
        return responseText;//如果要对结果进行多次处理,就在这里return,第二次then就会得到这个return的数据
    },()=>{
        console.log("失败")
    }).then(//开始第二次then
        (上一次return的结果)=>{
            console.log("第二次处理")
            console.log(上一次return的结果)
        },
        ()=>{
            //第二次处理失败结果
        }
    )

封装一个类似$.Ajax()中的Promise的简易版本

let ajax=function(url, param, type = ‘POST‘){
      return new Promise(function(resolve, reject){
        $.ajax({
            type: type,
            url: url,
            data: param,
            dataType: ‘json‘,
            success(res) {
                resolve(res)
            },
            error(res) {
                reject(‘响应错误‘)
                // reject(res.statusText)
            }
        })
    })

}

// 使用示例
ajax(‘http://wh.xhd.cn/api/content/list.jspx‘,{channelIds: 1}).then(res=>{
    console.log(res)
})

///其他

//封装ajax
window.jQuery.ajax = ({method,path,body,headers})=>{//ES6语法
   //进行Promise封装
    return new Promise((resolve,reject)=>{//这句话是套路,记住
        let request = new XMLHttpRequest();
        request.open(method,path);//配置

        for (const key in headers) {//遍历header,设置响应头
            let value = headers[key];
            request.setRequestHeader(key,value);
        }
        request.send(body);//发送,并配置响应体

        request.onreadystatechange = ()=>{
            if(request.readyState ===4){
                if ( request.status>=200&&request.status<=400){
                    resolve.call(undefined,request.responseText);//执行成功函数
                }else if(request.status>=400){
                    reject.call(undefined,request);//执行失败函数
                }
            }
        }
    })
}
//调用myButton.addEventListener("click",(e)=>{
    //使用ajax
    $.ajax({
        method:"post",
        path:"/xxx",
        body:"username=mtt&password=1",
        headers:{
            "content-type":‘application/x-www-form-urlencoded‘,
            "mataotao":18
        }
    }).then(
        (responseText)=>{console.log(responseText);},//成功就调用这个函数
        (request)=>{console.log(request);}//失败就调用这个函数
    )
})

第一个要记住的:这个Promise必须接收一个函数,函数里面就是要做的事情(即发送请求,Ajax请求),一般来说,把所有东西放在里面,第一句就是return.然后要做的事情放在里面.

第二个要记住的:Promise接收的这个函数有两个参数,一个叫做resolve.一个叫reject 前两个要记住的写出来就是

return new Promise((resolve, reject) => {
        //要做的事
    });

第三个要记住的:如果成功了就调一下resolve(),如果失败了就调用reject(),所以Ajax()参数中不需要successFnfailFn了 并且将成功行和失败行对应的代码分别改为 resolve.call(undefined,request.responseText);//执行成功函数reject.call(undefined,request);//执行失败函数

上面是固定的套路

背下这个方法!!

function xxx(){
    return new Promise((f1, f2) => {
        doSomething()
        setTimeout(()=>{
            // 成功就调用 f1,失败就调用 f2
        },3000)
    })
}

xxx().then(success, fail)

// 链式操作
xxx().then(success, fail).then(success, fail)

原文地址:https://www.cnblogs.com/elexmiumiu/p/12196122.html

时间: 2024-08-30 05:13:52

ES6之Promise封装ajax()的相关文章

使用promise封装Ajax

一.封装Ajax 1 <script> 2 var ajax = new Promise((resolve, reject) => { 3 var xhr = new XMLHttpRequest(); 4 xhr.open('get', './test1.txt', true); 5 xhr.send(); 6 xhr.onreadystatechange = function() { 7 if (xhr.status == 200 && xhr.readyState

jq中使用promise封装ajax

let ajax=function(url, param, type = 'GET'){ const promise = new Promise(function(resolve, reject){ $.ajax({ type: type, url: url, data: param, dataType: 'json', success(res) { resolve(res) }, error(res) { reject('响应错误') // reject(res.statusText) } }

简单的基于promise的ajax封装

基于promise的ajax封装 1 //调用方式: 2 /* 3 ajaxPrmomise({ 4 url:, 5 method:, 6 headers:{} 7 }).then(res=>{}) 8 */ 9 10 ;(function(window){ 11 //设置默认的参数配置项 12 let _default = { 13 url:'', 14 baseURL:'', 15 method:'GET', 16 params:null, //get请求基于问号传参方式传递给服务器的内容

React Native 网络请求封装:使用Promise封装fetch请求

React Native中虽然也内置了XMLHttpRequest 网络请求API(也就是俗称的ajax),但XMLHttpRequest 是一个设计粗糙的 API,不符合职责分离的原则,配置和调用方式非常混乱,而且基于事件的异步模型写起来也没有现代的 Promise 友好.而Fetch 的出现就是为了解决 XHR 的问题,所以ReactNative官方推荐使用Fetch API.http://blog.csdn.net/withings/article/details/71331726 fet

【JavaScript进阶】深入理解JavaScript中ES6的Promise的作用并实现一个自己的Promise

1.Promise的基本使用 1 // 需求分析: 封装一个方法用于读取文件路径,返回文件内容 2 3 const fs = require('fs'); 4 const path = require('path'); 5 6 7 /** 8 * 把一个回调函数才分成两个回调函数 9 * @param filename 10 * @param successCallback 11 * @param errorCallback 12 */ 13 function getFileByPath(fil

ES6知识点-Promise对象

4.3Promise对象 4.3.1Promise概述 Promise是异步编程的一种解决方案. Promise是为了解决多重嵌套回调函数而提出的. 它不是新的语法功能,而是一种新的写法,允许将回调函数的嵌套,改成链式调用. Promise是一个对象,从它可以获取异步操作的消息. Promise提供统一的API,各种异步操作都可以用同样的方法进行处理. Promise有以下两个特点: 对象的状态不受外界影响.Promise对象代表一个异步操作,有三种状态:Pending(进行中).Resolve

微信小程序使用promise封装异步请求

一:开发了一段时间的微信小程序,发现里面的API都是这样的: wx.showModal({ title: '提示', content: '这是一个模态弹窗', success: function(res) { if (res.confirm) { console.log('用户点击确定') } else if (res.cancel) { console.log('用户点击取消') } } }) 如果代码多了逻辑多了,就会出现所谓的回调地狱. wx.showModal({ title: '提示'

ES6之Promise用法详解

一 前言 本文主要对ES6的Promise进行一些入门级的介绍.要想学习一个知识点,肯定是从三个方面出发,what.why.how.下面就跟着我一步步学习吧~ 二 什么是Promise 首先是what.那么什么是Promise呢? 以下是MDN对Promise的定义 The Promise object is used for asynchronous computations. A Promise represents a single asynchronous operation that

原生JS封装ajax方法

1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> 6 <title>Examples</title> 10 <script> 11 12 //将对象序列