2011-12-15 131 views
0

我在我的网站上的导航栏,它被建在一些链:Ajax回调连锁

// in Init method 
nav 
    .hideContainer() 
    .fetchData() 
    .buildHTML() 
    .eventify() 
    .showContainer(); 

这是确定的,对我来说工作正常。但在fetchData方法我使用本地数据加载(内联json)。但现在,我需要获得远程数据(来自ajax调用)。我能不改变Init方法吗?

我曾尝试与同步Ajax调用做到这一点:

// in fetchData() method 
var data; 
$.ajax ({ 
    async: false, 
    url : '/some/url/', 
    success : function(res) { 
     data = res; 
    } 
}); 
return data; 

但我知道,这是缓慢的 - 它的阻止浏览器它的加载时间。

我知道,我可以在这样的方式修改我的Init方法,如:

nav 
    .hideContainer() 
    .fetchData(function(){ 
     nav.buildHTML().eventify().showContainer() 

}); 

但是,我想不修改Init方法,我能做到这一点?

P.S.我认为我应该去Deffered对象的方向。我对吗?

+1

不,你不能让init保持原样*和*让ajax异步运行。它的异步点在于它会立即返回,所以Init不能像那样工作。 – kubetz 2011-12-15 01:46:14

回答

1

你不能有$.ajax异步工作,同时希望.fetchData()与您的数据一起返回。

你是对的,设置async: false是坏的,改变init()是一个更好的选择,即使你失去了优雅的链接。

你可以改变你的代码是这样的:

function fetchData() { 
    // ... 
    return $.ajax ({ 
    url : '/some/url/', 
    success : function(res) { 
    data = res; 
    } 
    }); 
} 

function init() { 
    // ... 
    nav 
    .hideContainer() 
    .fetchData() 
    .done(function() { 
     nav 
     .buildHTML() 
     .eventify() 
     .showContainer(); }); 

您不必回调引入fetchData()功能,因为你可以返回deferred object通过ajax()返回,然后调用它done() - 见documentation

另请参阅fail()then()如果您想要处理错误。

1

做这样的事情在你的抓取方法

$.ajax ({ 
    url : '/some/url/', 
    success : buildHTML 
}); 

然后,当数据到来时,它会调用buildHTML()