同步与异步,阻塞和非阻塞(bootstrap-table/ajax获取数据)

上半部分转自https://gitee.com/SnailClimb/JavaGuide/blob/master/docs/java/basis/BIO,NIO,AIO总结.md

同步和异步

关于同步和异步的概念解读困扰着很多程序员,大部分的解读都会带有自己的一点偏见。参考了 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-tablecolumn属性的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一下老板有没有返回结果。在这里阻塞与非阻塞与是否同步异步无关。跟老板通过什么方式回答你结果无关

参考:
链接:https://www.zhihu.com/question/19732473/answer/20851256

用ajax实现bootstrap-table

问题表述:数据库里存的是 id ,不能自动获去他的名称,需要自己手动配置
BootStrap-tablecolumn属性的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;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值