顺序发送异步请求、同时发送异步请求;apply()与call()的区别
顺序发送异步请求、同时发送异步请求;apply()与call()的区别
木子丰 发表于4年前
顺序发送异步请求、同时发送异步请求;apply()与call()的区别
  • 发表于 4年前
  • 阅读 62
  • 收藏 2
  • 点赞 0
  • 评论 0

前台发送异步请求的情况:
1、顺序发送:A执行完了,再执行B
2、无序发送:A、B执行的顺序无所谓
3、同时发送:A、B同时执行
==========================================
对于顺序发送
$.when(A).then(function() {B});(then可换为done)
==========================================
对于无序发送
1.直接按代码顺序执行A,B或$.when(A,B)
$.when(A,B)的其它写法$.when.apply(thisArg, [A,B])$.when.call(thisArg,A,B)
2.使用Function.prototype.apply()方法:
语法:fun.apply(thisArg,argsArray)
fun为一个函数
thisArg为运行函数的作用域(或理解成调用函数的对象)
argsArray为参数任务列表,如果其长度为3,则fun函数执行3次,分别取argsArray[0],argsArray[1],argsArray[2]作为参数分别运行。

fun ... $.when
thisArg ... $
argsArray ... [A,B]

代码如下:
var tasks = [A,B];
$.when.apply($,tasks);
3.使用Function.prototype.call()方法:
语法:fun.call(thisArg,args[0],args[1],...)

其实apply()与call()本质上是一样的,只不过apply把所有的参数放到一个数组中,通过数组传递,而call需要把每个参数都详细列出,


==========================================
对于同时发送:像java的多线程一样

1,按顺序书写代码即可:A;B;因为A,B都是异步请求,请求发送后,会接着执行后面的代码
或通过setTimeout实现(感觉有点多此一举)
setTimeout(function() {A}, 10);
setTimeout(function() {B}, 10);
虽然不是真正意义上的同时执行,但是效果差不多了
==========================================


对于使用$.when方法执行异步请求后,要返回deferred对象的情况:

var deferred = new Deferred();
$.when(A,B).then(
    function() {
        deferred.resolve({});
    },
    function() {
        deferred.reject({});
    },
);
return deferred;
//由于异步的原因deferred对象会先返回,其后根据A,B的执行情况,会影响其状态:成功或失败


 

  • 点赞
  • 收藏
  • 分享
粉丝 18
博文 232
码字总数 68285