ajax的Deferred应用场景

开头

ajax的Deferred主要用于异步请求获取数据后,再去执行对应业务逻辑,形成一条链式代码结构。个人理解Deferred就是异步获取数据后的一种处理方式。

对比

$.ajax({
		type: "POST",
	    url: baseURL + url,
		contentType: "application/json",
	    data: JSON.stringify(vm.user),
	    success: function(r){
	    	alert("成功")//进行外部方法调用
		}
	});

异步
如果我们将ajax请求封装起来。然后根据传入的值,请求不同的数据,进行不同的处理呢,在success方法中写上大量的’if‘判断?显然这样的写法就会有局限性,这时候需要Deferred。
同步
ajax的同步获取数据的方式会帮助开发者省去很多麻烦,但同样也会带来一些问题。最明显的就是ajax请求与页面渲染相阻塞,也就是说如果ajax请求时间过长,那麽页面将会卡死,这个时候建议使用Deferred。

Deferred的简单应用

  • 将ajax封装成了sendAjax()方法
  • 后台接口默认休眠5秒后返回“hello world”
function sendAjax(_url,_data){
		//给url设置默认值
   		if(_url == null) _url="127.0.0.1:8080/helloworld";
   		var defer = $.Deferred();
   		$.ajax({
   		    url : _url,
   		    data:_data,      
   		    //async : false,//原来设置的同步要注释掉
   		    success: function(backData){
   		    	var result = null;
   		    	console.log("ajax:::::"+backData);
   		    	console.log(backData);
   		    	if(backData.code == "200"){
   		    		//“hello world”
   		    		result = backData.data;
   		    	}else{
   		    		result = "";
   		    	}
   		    	//result为方法需要返回的数据
   		        defer.resolve(result);
   		    }
   		});   
   		return defer.promise();
   	}
  • 以下为简单的demo
<body>
	<div onclick="start()">aaaaaa</div>
</body>

<script type="text/javascript">
	//点击触发start方法
	function start(){
		//调用second()
		var data = second();
		console.log("data"+data) //菜  获取ajax返回值失败
	}
	//请求ajax 并尝试将就获取数据返回start
	function second(){
		var end = "菜";
		var result = sendAjax(null,null);
//    	$.ajaxSettings.async = false;
		//该方法将在ajax请求完成后执行
    	result.then(function(data){// data就是返回的值“hello world”
    		end = data;
    		console.log("getData:::::"+data);
    	});
    	/* $.when(sendAjax()).done(function(data){
    		end = data;
    	}); */
//    	$.ajaxSettings.async = true;
		return end
    }
    </script> 

获取的数据因为异步的原因也无法返回给调用方法start,这也是所有异步方法的通病了,如果强行使用同步,一样会使得页面渲染被阻塞。
(新手上路,如有错误,欢迎指正)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值