同步与异步,阻塞和⾮阻塞(bootstrap-tableajax获取数据)
上半部分转⾃
同步和异步
关于同步和异步的概念解读困扰着很多程序员,⼤部分的解读都会带有⾃⼰的⼀点偏见。参考了 Stackoverflow相关问题后对原有答案进⾏了进⼀步完善:
When you execute something synchronously, you wait for it to finish before moving on to another task. When you execute something asynchronously, you can move on to another task before it finishes.
当你同步执⾏某项任务时,你需要等待其完成才能继续执⾏其他任务。当你异步执⾏某些操作时,你可以在完成另⼀个任务之前继续进⾏。
同步 :两个同步任务相互依赖,并且⼀个任务必须以依赖于另⼀任务的某种⽅式执⾏。 ⽐如在A->B事件模型中,你需要先完成 A 才能执⾏B。 再换句话说,同步调⽤中被调⽤者未处理完请求之前,调⽤不返回,调⽤者会⼀直等待结果的返回。
异步: 两个异步的任务完全独⽴的,⼀⽅的执⾏不需要等待另外⼀⽅的执⾏。再换句话说,异步调⽤种
⼀调⽤就返回结果不需要等待结果返回,当结果返回的时候通过回调函数或者其他⽅式拿着结果再做相关事情,
阻塞和⾮阻塞
阻塞: 阻塞就是发起⼀个请求,调⽤者⼀直等待请求结果返回,也就是当前线程会被挂起,⽆法从事其他任务,只有当条件就绪才能继续。
⾮阻塞: ⾮阻塞就是发起⼀个请求,调⽤者不⽤⼀直等着结果返回,可以先去⼲其他事情。
如何区分 “同步/异步 ”和 “阻塞/⾮阻塞” 呢?
同步/异步是从⾏为⾓度描述事物的,⽽阻塞和⾮阻塞描述的当前事物的状态(等待调⽤结果时的状态)。
同步和异步
同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication)
同步
同步,就是在发出⼀个调⽤时,在没有得到结果之前,该调⽤就不返回。但是⼀旦调⽤返回,就得到返回值了。
换句话说,就是由调⽤者主动等待这个调⽤的结果。
异步
异步则是相反,调⽤在发出之后,这个调⽤就直接返回了,所以没有返回结果。换句话说,当⼀个异步过程调⽤发出后,调⽤者不会⽴刻得到结果。当⼀个异步过程调⽤发出后,调⽤者不会⽴刻得到结果。⽽是在调⽤发出后,被调⽤者通过状态、通知来通知调⽤者,或通过回调函数处理这个调⽤。
典型的异步编程模型⽐如Node.js举个通俗的例⼦:你打电话问书店⽼板有没有《分布式系统》这本书,如果是同步通信机制,书店⽼板会说,你稍等,”我查⼀下",然后开始查啊查,等查好了(可能是5秒,也可能是⼀天)告诉你结果(返回结果)。⽽异步通信机制,书店⽼板直接告诉你我查⼀下啊,查好了打电话给你,然后直接挂电话了(不返回结果)。然后查好了,他会主动打电话给你。
在这⾥⽼板通过“回电”这种⽅式来回调。
异步请求原理
在ajax执⾏期间,js代码会继续执⾏直到最终的return语句。并不会等待ajax请求结束后才往下执⾏。最终return的的flag值为就可能为true,也可能为false。
遇到的问题
在设置BootStrap-table 的 column属性的formatter属性⽅法时,获取不到post得到的数据,⽽单独调⽤的时候,可以正常获取到json数据
解决⽅法1:把ajax的async设为false
解决⽅法2:直接⽤post请求,不⽤ajax;但是$.post(); $.get();也默认都是异步,所以要在post前,添加 $.ajaxSettings.async = false;。
额。这么看来这是同⼀个解决⽅法,就是 改为同步。
function getDeptById(value, row, index){
var value;
var deptId = row.deptId;
if(row.deptId ==0){
return"⽆";
}
var v1 = $.ajax({
url :"/getDeptById/"+ deptId,
type :"POST",
dataType :"json",
async:false,//同步,默认是true,异步
success :function(data){
if(data !=null){
// alert(data.status);⽆论同步异步这⾥都可以正常获取
/
/只是异步获取不到返回数据
console.log(data.data.deptName);
// value = JSON.stringify(result);
value = data.data.deptName;
}
}
});
alert(JSON.stringify(v1));
//同步readyState:4 得到数据
//异步readyState:1 没有数据
return value;
}
0: 请求未初始化
1: 服务器连接已建⽴
2: 请求已接收 接收到了响应头
3: 请求处理中 正在下载响应体
4: 请求已完成,且响应已就绪
阻塞和⾮阻塞
阻塞和⾮阻塞关注的是程序在等待调⽤结果(消息,返回值)时的状态.
阻塞
阻塞调⽤是指调⽤结果返回之前,当前线程会被挂起。调⽤线程只有在得到结果之后才会返回。
⾮阻塞
⾮阻塞调⽤指在不能⽴刻得到结果之前,该调⽤不会阻塞当前线程。
还是上⾯的例⼦,你打电话问书店⽼板有没有《分布式系统》这本书,你如果是阻塞式调⽤,你会⼀直把⾃⼰“挂起”,直到得到这本书有没有的结果,如果是⾮阻塞式调⽤,你不管⽼板有没有告诉你,你⾃⼰先⼀边去玩了, 当然你也要偶尔过⼏分钟check⼀下⽼板有没有返回结果。在这⾥阻塞与⾮阻塞与是否同步异步⽆关。跟⽼板通过什么⽅式回答你结果⽆关ajax是同步还是异步
⽤ajax实现bootstrap-table
问题表述:数据库⾥存的是 id ,不能⾃动获去他的名称,需要⾃⼰⼿动配置
BootStrap-table 的 column属性的formatter属性
,{
title :"专业",
field :'magorId',
formatter : getMajorById,
},
function getMajorById(value, row, index){
var majorId = row.majorId;
var value;
if(row.majorId ==0){
return"未分配";
}
$.ajaxSettings.async=false;
$.post("/getMajorById",{
"majorId": majorId
},function(data){
value = data.data.majorName;
console.log(value);
});
return value;
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论