原生Js实现ajax,并返回Promise结果

原理:通过XMLHttpRequest对象向服务器发异步请求,将结果使用Promise返回

function promiseAjax(url, type, data, timeout = 8000) {
       return new Promise((resolve, reject) => {
       	   //  请求方式小写转换 
           type = type.toLocaleLowerCase()
           // 新建一个XMLHttpRequest实例
           const xhr = new XMLHttpRequest()
           // 设置超时时间,超时自动终止
           xhr.timeout = timeout
           // 判断请求方式,整理数据
           if (type === 'get') {
               if (data) {
                   url += '?'
                   for (let key in data) {
                       url += (key + '=' + data[key] + '&')
                   }
                   url = url.substring(0, url.length - 1)
               }
               xhr.open(type, url)
               xhr.send(null)
           }

           if (type === 'post') {
               xhr.open(type, url)
               xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
               if (data) {
                   xhr.send(data)
               } else {
                   xhr.send(null)
               }
           }
           
		  // 使用定时器判断是否超时,返回reject
           let timer = setTimeout(() => {
               reject('请求超时了')
               throw new Error('请求超时')
           }, timeout)
           
           // 响应回调,获取内容
           xhr.onreadystatechange = function() {
               if (xhr.readyState === 4) {
                   if (xhr.status === 200) {
                   		// 转换JSON,可转可不转
                       let result = JSON.parse(xhr.responseText)
                       // 清除定时器
                       clearTimeout(timer)
                       // resolve
                       resolve(result)
                   }
               }
           }
			// 失败回调,reject
           xhr.onerror = function(err) {
               reject('请求失败,' + err)
           }
       })
   }

测试

promiseAjax('http://jsonplaceholder.typicode.com/posts', 'get', null)
      .then(res => {
           console.log(res);
       })
       .catch(err => {
           console.log(err);
       })
promiseAjax('http://jsonplaceholder.typicode.com/comments', 'get', {
	       postId: 1
	    })
	    .then(res => {
	        console.log(res);
	    })
	    .catch(err => {
	        console.log(err);
	    })

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值