同步交互:指发送一个请求,需要等待返回,然后才能够发送下一个请求,有个等待过程;
异步交互:指发送一个请求,不需要等待返回,随时可以再发送下一个请求,即不需要等待。
这是我在网上看到的,但是感觉还是不够生动,后来就和朋友进行交流了一下。朋友跟我说了很多生活中的示例,方便我理解。我最终得出一个结论:异步是同一件事在同一时间段不连续的完成,而同步是同一件事在同一时间段连续的完成。
举个例子吧:
比如聊天:
小明:发了一个消息给小红;在发消息之前,小红是在写代码的,当小红收到小明的消息时,回复了小明。然后继续写自己的代码,而不是停下来等小明的回复,小明回复了小红,小红就会回复小明,否则小红一直在做自己的事,这个聊天的过程就是一个异步的交互。
看到这里大家应该会很容易想到我们平时前端页面和后台交互的Ajax请求,前端页面会通过Ajax发送一个请求给后台
var url = 'Ajax/Json.aspx?Handler=ServiceProxy&Entity=SalePlan&Method=GetSaleTodayDetailList';
$.post(url, { OrgID: org, SaleType: sale }, function (data) {
if (data.Rows == "") {
$('.food-list').html("<div style='text-align:center;margin-top:40px'><img src='Resource/images/diqiu.png'/><p>没有内容!管理员可能去外星了!</p></div>");
} else {
$('.food-list').html(FoodListTemplate(data));
TabooLabel(sale);
AddImg();
AddRecommendOption("radius-img");
}
}, 'json');
当后台接收到前端的请求,会进行回复(后台回复前端的请求有一个时间段,如果在这段时间里面,前端一直在等待后台的回复,那么就是同步;如果前端在等待后台的回复的同时,还在处理别的事,那么就是异步)。
看到这里,会让我很容易想到回调,当某件事成功后返回一个结果,接收到这个结果,就会进行下一步。
这段时间 ,一直在用AngularJs写代码,就想到了里面的promise对象,这里就会用到angularJs的内置服务$q,
getCodeTableList: function (CodeCategory) {
var deferred = $q.defer(); //声明延后执行
$.post("Ajax/Json.aspx?Handler=ServiceProxy&Entity=CodeTable&Method=GetCodeTableList", { "CodeCategory": CodeCategory }, function (data) {
var result = [];
for (var i = 0; i < data.Rows.length; i++) {
var list = {};
list.text = data.Rows[i].CodeName;
list.id = data.Rows[i].CodeValue
result.push(list)
}
deferred.resolve(result); //声明执行成功
});
return deferred.promise;//返回一个promise对象
},
在使用promise对象时,我们需要先声明一个deferred对象,当执行成功时,我们会调用
deferred.resolve();
最后返回一个promise对象
return deferred.promise
在控制器里面,我们会对返回的结果进行处理,
ServiceList.getCodeTableList("ExpenseStandard").then(function (res) {
$scope.config2 = {
data: res,
placeholder: '消费标准'
};
})
当接收到成功的结果,我们就会调用.then方法,进行下一步数据的处理,平时我们就是对成功事件作出处理,但是实践上,then中有三个参数,分别是成功回调、失败回调、状态变更回调。
.then(function(value){
console.log("in promise1 ---- success");
console.log(value);
},function(value){
console.log("in promise1 ---- error");
console.log(value);
},function(value){
console.log("in promise1 ---- notify");
console.log(value);
})
这就是我目前的浅显的理解