关于http 请求的同步与异步调用
程序员文章站
2024-02-22 15:08:10
...
这是一个常见的问题,也是一个容易搞混的问题。这里先说明我个人判断同步请求还是异步请求的依据:所调用的请求(某个url),阻塞了后续代码的执行则为同步,反之则为异步。
同步与异步的概念:
同步、异步常常用来描述一次方法调用过程。
同步:方法一旦调用,调用者必须等待方法的返回结果后才能进行后续的操作。
异步:调用者不必等待方法的返回结果,也能进行后续的操作。而,异步方法通常会在另外一个线程中,“真实”地执行着。整个过程,不会阻碍调用者的工作。
几种常见情况的说明:
1.html中的a标签与ajax 请求
a. <a href='url'>xx</a> 这种写法产生的网络请求可以认为是异步的,但是没意义,因为a标签是个请求链接,点击之后网页跳转。测试 window.location.href='url'(a标签的js 实现),结果是异步的。
// 按标签同步
function a_tb(){
tips.val("a标签同步测试");
window.location.href="ht";
alert("看不出来同步的效果,调用者也没有阻塞");//姑且认为是一种 异步
tips.val(tips.val()+" \n测试结束");
}
b.ajax 请求既可以同步也可以异步,关键在于async 参数的配置--true 异步,false 同步。
// ajax 默认异步方法调用
function ajax_tb(){
tips.val("ajax 同步测试");
$.ajax({
"url":"ht",
//"type":"GET",
"type":"POST",
"success":function(text){
tips.val(tips.val()+"\n调用返回结果:"+text);
},
"error":function(text){
},
"async":false//设置同步请求
});
tips.val(tips.val()+"\najax同步测试结束");
}
执行结果:
2.还有不同程序语言实现的http请求,要更具实际情况来判断是同步还是异步。
2.1 java http 异步请求库:
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpasyncclient</artifactId>
<version>4.1.1</version>
</dependency>