jQuery的deferred对象的使用可以参考阮一峰的jQuery的deferred对象详解
-----------------------------------------------------------------------------------------------------------------------------
js模块化开发时用到requirejs加载js,有两个模块A和B,require(A),require(B),B依赖A,B中要使用A中异步从后台加载的数据,想到了jQuery的deferred对象,A中返回一个deferred对象defer,等到A中加载完后defer.resolve(data),B中defer.done(function(data){})
app.js
requirejs(['jquery'],function($){ var a=require(A) ; var b=require(B) ; $("#query").off('click').on('click', function () { var a=require(A) ; var b=require(B) ; }); })
A.js
define(['jquery'],function ($) { var defer=$.Deferred(); $.ajax({ url:"", success:function(data){ defer.resovle(data) } }) return defer })
B.js
define(['jquery','A'],function ($,defer) { defer.done(function(data){ //... }) })
这样之后,第一次加载没问题。会加载A.js,B.js 但是查询的时候不会加载A.js,B.js,A中的ajax会执行,但是B中defer对象的状态已改变,获取不到A中的数据,因此修改为如下
A.js
define(['jquery'],function ($) { var defer=$.Deferred(); $.ajax({ url:"", success:function(data){ defer.resovle(data) } }) return function(g){ if(g!=undefined){ defer= g; } else{ return defer; } } })
B.js
define(['jquery','A'],function ($,defer) { defer().done(function(data){ //... defer($.Deferred()); }) })
B中每次用完给一个新的对象,让A中的defer指向新对象,巧妙改变defer状态。