ajax 回调,封装Ajax(回调与Promise)

1. 回调函数的形式

/*

@params:

url: 请求地址

method: 请求方式,GET/POST

data:请求数据

async:是否异步

header:请求头

success: 成功回调

fail: 失败回调

*/

function sAjax(opts) {

opts.url = opts.url || '';

opts.method = (opts.method || 'GET').toUpperCase();

opts.data = opts.data || {};

opts.async = opts.async && true; //默认异步 -- 这里注意一下,因为这里需要传递布尔值

opts.headers = opts.header || 'json'; //默认json

opts.success = opts.success || function() {};

opts.fail = opts.fail || function() {};

//仅支持POST和GET

if (opts.method !== 'GET' && opts.method !== 'POST') {

throw new Error('请使用GET或POST请求');

}

//GET需要把参数写到地址中

var dataArr = [];

var dataStr = '';

for (var k in opts.data) {

dataArr.push(k + '=' + opts.data[k])

}

dataStr = dataArr.join('&');

if (opts.method === 'GET') {

opts.url = opts.url + '?' + dataStr;

}

//创建xhr对象

var xhr = null;

try {

xhr = new XMLHttpRequest();

} catch {

alert('您的浏览器不支持AJAX!');

return;

}

//监听readyState改变

xhr.onreadystatechange = function() {

if (xhr.readyState === 4) {

if (xhr.status === 200) {

opts.success(xhr.response);

} else {

opts.fail(xhr.response);

}

}

}

//确定发送类型

xhr.open(opts.method, opts.url, opts.async);

//发送 -- 如果是POST,需要设置请求头,参数写到send方法中

if (opts.method === 'POST') {

xhr.setRequestHeader('content-type', 'application/' + opts.header);

xhr.send(dataStr);

} else {

xhr.send();

}

}

/* 调用 */

sAjax({

url: 'http://localhost:3000/goods',

method: 'post',

data: {

name: 'Tom',

sex: 'man'

},

async: false,

header: 'x-www-form-urlencoded',

success(res) {

console.log(res);

},

fail(err) {

console.log(err);

}

})

2. promise的形式

/*

@params:

url: 请求地址

method: 请求方式,GET/POST

data:请求数据

async:是否异步

header:请求头

*/

function sAjax(opts) {

return new Promise((resolve, reject) => {

opts.url = opts.url || '';

opts.method = (opts.method || 'GET').toUpperCase();

opts.data = opts.data || {};

opts.async = opts.async && true; //默认异步 -- 这里注意一下,因为这里需要传递布尔值

opts.headers = opts.header || 'json'; //默认json

//仅支持POST和GET

if (opts.method !== 'GET' && opts.method !== 'POST') {

throw new Error('请使用GET或POST请求');

}

//GET需要把参数写到地址中

var dataArr = [];

var dataStr = '';

for (var k in opts.data) {

dataArr.push(k + '=' + opts.data[k])

}

dataStr = dataArr.join('&');

if (opts.method === 'GET') {

opts.url = opts.url + '?' + dataStr;

}

//创建xhr对象

var xhr = null;

try {

xhr = new XMLHttpRequest();

} catch {

alert('您的浏览器不支持AJAX!');

return;

}

//监听readyState改变

xhr.onreadystatechange = function() {

if (xhr.readyState === 4) {

if (xhr.status === 200) {

resolve(xhr.response);

} else {

reject(xhr.response);

}

}

}

//确定发送类型

xhr.open(opts.method, opts.url, opts.async);

//发送 -- 如果是POST,需要设置请求头,参数写到send方法中

if (opts.method === 'POST') {

xhr.setRequestHeader('content-type', 'application/' + opts.header);

xhr.send(dataStr);

} else {

xhr.send();

}

})

}

/* 调用 */

sAjax({

url: 'http://localhost:3000/goods',

method: 'post',

data: {

name: 'Tom',

sex: 'man'

},

async: false,

header: 'x-www-form-urlencoded'

}).then(res => {

console.log(res)

})

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Promise 封装 Ajax 是一种常见的异步编程方式,可以通过 Promise 对象来处理 Ajax 请求的成功和失败。具体实现方式可以参考以下代码: ``` function ajax(url, method, data) { return new Promise(function(resolve, reject) { var xhr = new XMLHttpRequest(); xhr.open(method, url, true); xhr.onreadystatechange = function() { if (xhr.readyState === 4) { if (xhr.status === 200) { resolve(xhr.responseText); } else { reject(xhr.statusText); } } }; xhr.onerror = function() { reject(xhr.statusText); }; xhr.send(data); }); } ``` 使用时可以这样调用: ``` ajax('/api/data', 'GET') .then(function(response) { console.log(response); }) .catch(function(error) { console.error(error); }); ``` 这样就可以通过 Promise 封装 Ajax 请求,实现更加优雅的异步编程。 ### 回答2: Promise是一种用于处理异步操作的封装工具,它可以帮助我们更好地管理和处理异步任务。而Ajax是一种用于实现前端与后端数据交互的技术,通过发送HTTP请求来获取数据并在页面上进行展示。 将Promise封装Ajax可以带来以下好处: 1.简化代码:传统的Ajax代码往往会包含大量的回调函数,逻辑复杂且难以维护。使用Promise封装Ajax可以将异步操作分离出来,并以一种更加直观和一致的方式处理异步任务,使代码更加简洁明了。 2.提高可读性:Promise提供了then和catch等方法来处理异步任务的成功和失败,可以将异步操作的处理逻辑写在链式调用中,使代码的逻辑更加清晰易懂。 3.异常处理:通过Promise的catch方法,可以捕获到异步任务中的异常并进行统一的处理,避免异常被控制流终止。 下面是一个使用Promise封装Ajax的示例代码: ```javascript function ajax(url, method, data) { return new Promise(function(resolve, reject) { var xhr = new XMLHttpRequest(); xhr.open(method, url, true); xhr.onreadystatechange = function() { if (xhr.readyState === 4) { if (xhr.status === 200) { resolve(xhr.responseText); } else { reject(new Error(xhr.statusText)); } } }; xhr.send(data); }); } ajax('http://example.com/api', 'GET') .then(function(response) { console.log('请求成功:', response); }) .catch(function(error) { console.log('请求失败:', error); }); ``` 以上代码中,ajax函数接受三个参数:url、method和data,通过XMLHttpRequest发送请求,并根据响应状态码进行相应的处理。使用Promise的resolve和reject来处理请求成功和失败的情况,以便后续链式调用then和catch进行处理。这样就可以更加方便地管理和处理Ajax请求了。 ### 回答3: 封装PromiseAjax请求可以提供更加简洁和可读性高的代码,同时能够更好地处理异步操作和错误处理。下面是一个示例代码: ```javascript function ajax(url) { return new Promise((resolve, reject) => { const xhr = new XMLHttpRequest(); xhr.open('GET', url); xhr.onload = function() { if (xhr.status === 200) { resolve(xhr.response); } else { reject(new Error(xhr.statusText)); } }; xhr.onerror = function() { reject(new Error('Network Error')); }; xhr.send(); }); } // 调用封装Ajax请求 ajax('https://api.example.com/data') .then(response => { console.log(response); }) .catch(error => { console.error(error); }); ``` 以上代码中,我们创建了一个`ajax`函数来封装Ajax请求。该函数接受一个URL参数,并返回一个Promise对象。在函数内部,我们使用`XMLHttpRequest`对象来发送HTTP请求,并在请求完成后处理响应和错误。 当请求成功响应时,我们调用`resolve`函数将响应作为参数传递给Promise对象的`then`方法中的回调函数,从而能够在调用`ajax`函数后链式调用`then`方法获取响应数据。 当请求出现错误时,无论是网络错误还是HTTP状态码错误,我们都调用`reject`函数将错误信息作为参数传递给Promise对象的`catch`方法中的回调函数,在调用`ajax`函数后可以链式调用`catch`方法捕获错误并进行错误处理。 通过封装PromiseAjax请求,我们能够更加清晰地处理异步操作和错误处理,提高代码的可读性和可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值