jQuery的deferred对象状态还原

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状态。

posted @ 2020-07-03 10:52  oddPoint  阅读(197)  评论(0)    收藏  举报