一般在WEB开发时总会涉及到从服务器调用接口的操作,为了不影响用户操作,一般会使用异步方式执行,从而不阻塞用户的界面操作。而一些常用的调用服务会封装成独立模块供使用。这时候就会遇到一些问题。比如:若所有服务内的方法都是异步方式的,则如何在外部控制两个异步任务的顺序?如何较为统一地处理超时以及执行异常的状况?…等等
直到后来看到了$q
…
异步操作
异步操作有一般使用 jQuery的ajax,本文结合AngularJs,因此也顺带引入Angular的$http
服务。
ajax
ajax的常用写法如下:
$.ajax({
type:'post',//or 'get'
url:'api/foo',
data:{
'a':'v'},
async:true, //or false
success:function(response){
parseResponse(response);
},
error:function(err){
handleError(err);
}
})
在上述场景中async
决定了ajax是否阻塞界面进程。若asycn=false,则在请求过程中用户界面无响应,反之无影响。
需要强调的是:若在async=true
情况下更新Angular的$scope中的数据,应该调用$scope.$apply()
来手动完成刷新
$http
基本使用
angular中的$http
默认均为异步执行,同时与$scope
的刷新不冲突。常用方式如下:
/**
* @param method:post,get.....
* @param url:api REST路径
* @param data:封装在request请求中的参数
* @param param:写在url路径后面的参数'?param=v¶m2=v2...'
* @param timeout:超时时间
*/
$http({method:'POST', url:url, data:data, param:param,
timeout:5000})
.success(function(response){
parseResponse(response);
})
.error(function(err,stat){
handleErr(err);
});
[附]post的问题
若直接使用AngularJs 的 $http post
请求在SpringMVC中通过@RequestParams是拿不到值的。
参考