javascript异步处理与Jquery deferred对象用法总结

2020-05-19 07:41:32易采站长站整理

};
setTimeout(tasks,5000);
return dtd.promise(); // 返回promise对象
};
wait(dtd)
.done(function(){ alert("成功了!"); })
.fail(function(){ alert("出错啦!"); });
dtd.resolve(); //这里修改dtd对象的状态无效

一些情况的处理:

1.嵌套异步操作的处理。

如果一个函数内部执行异步任务,并且在异步任务的done回调内会嵌套另一个异步任务,那么简单返回第一个异步任务的返回值是不行的,需要另外自行定义一个Deferred对象作为返回值。


function loadComponent(id){
var dtd = $.Deferred();
//loadScript将异步加载一个js文件,所以返回值是一个Deffered对象
return loadScript(id)
.done(function() {
//js加载后,触发component的load事件,此事件内将使用Ajax获取页面模板和数据,生成最终的html
app.getComponent(id).trigger("load")
.done( function(){
dtd.reslove(agruments);
}).fail( function(){
dtd.reject(agruments);
});
});
//返回自定义的dtd对象,才能保证返回值的done回调在load事件完成后执行
return dtd;
}

2.一个函数内同时包含同步和异步

case
的处理。


/* 这个函数返回一个异步对象,当异步对象执行done时,表示component被加载完成 */
function requireComponent(id){
if (this.components[id]){
//如果component已经被加载,直接返回一个reslove的异步对象,否则返回值内容与else分支不同,后续代码难以处理
var dtd = $.Deferred();
dtd.reslove(this.getComponent(id));
return dtd;
}
else{
//如果component未被加载,loadScript将异步加载JavaScript并执行,然后将被加载的component放入this.components
return loadScript(id);
}
}

Jquery异步模型有一个缺点,就是缺乏类似

wait
操作的处理能力,如果多个异步调用要顺序发生时,就要在done里面嵌套处理,影响代码可读性.


aSyncTask1.done( function () {
//...第一个操作完成后的处理
asyncTask2.done( function () {
//...第二个操作完成后的处理
asyncTask3.done( function () {
//...第三个操作完成后的处理
});
})
})

更多关于jQuery相关内容感兴趣的读者可查看本站专题:《jQuery form操作技巧汇总》、《jQuery文件与目录操作技巧汇总》、《jquery中Ajax用法总结》、《jQuery扩展技巧总结》、《jquery选择器用法总结》及《jQuery常用插件及用法总结》

希望本文所述对大家jQuery程序设计有所帮助。