2011-09-01 52 views
0

我目前正在使用许多Ajax请求来访问来自restfull服务的数据。有些操作需要多个连续呼叫。只要我执行了第一个我遇到了竞争条件。 (调用ajaxCall_1,然后ajaxCall_2,它使用ajaxCall_1的结果,但ajaxCall_1尚未返回)。当然,我可以使用.success属性,但这对我来说并不适用。让我用下面的一个简单例子来解释。我有一个包含.js文件:JQuery Promise question

function getServerBoolean(){ 
    $.get('url_1',function(data){return data)}); 
} 

function refreshWidget(){ 
    $.get('url_2',function(data){ 
     var serverBoolean = getServerBoolean(); 
     --do some html building here based on boolean returned from server-- } 
    ); 
} 

function setServerValue(newValue){ 
    $.post('url',{key:newValue},function(data){ 
     // server model has changed, so refresh widget. 
     refreshWidget(); 
    }); 

} 

每当我打电话setServerValeu(“someValue中”),小部件需要对自己进行刷新,但在此之前,它需要知道服务器的布尔值。以这种方式,我有更多的简化,所以简单地给回调作为方法参数,然后在.success()中调用它并不会为我做到这一点。

我偶然发现了$ .when $ .then $ .done方法,但我不确定如何将这些用于我的情况。有没有人可以帮助我如何设置?

在此先感谢!

理查德

+0

为什么不能使用.success()来调用一个包含ajaxCall_2的函数? –

+0

我有一个包含许多rest/ajax调用服务器的api。如果我要用这些方法使用回调函数,我最终会得到很多带回调函数的嵌套调用,但由于维护代码,这不是我想要的。接下来,我将不得不改变所有的方法,以允许回调函数作为参数,这也不是我想要的,我想保持尽可能干净的API。 $ .when()。然后完成这个。 (它对我来说就像一个魅力) – Bjarne77

回答

1

我不知道$。当$然后$做,但这样做将通过周围回调的功能性的方式。它可能看起来像:

function getServerBoolean(dataCallback){ 
    $.get('url_1', dataCallback); 
} 

function refreshWidget(){ 
    $.get('url_2',function(data){ 
     getServerBoolean(function(boolValueReturned) { 
      //do something with the value 
     }); 
    }); 
} 

当然也有可能是众多来调整这一点,例如像检查(在getServerBoolean)如果我们得到的说法是一个函数的方式,如果不将其设置为一些默认的回调。

+0

这听起来不错。我会试试这个。我有点害怕这个(在我的情况下)最终会在很多嵌套的方法/回调中结束。我希望$ .when()。然后方法可以避免发生.. – Bjarne77

+0

无论如何这是最干净的方法。我检查了$。当jQuery文档中的描述和基本上类似的事情 - 你传递了一些其他回调完成后执行的回调。如果大多数(如果不是全部)回调函数被定义为命名函数,那么代码不应该太复杂,然后你只需要定义“流”或函数,以便按照期望的顺序传递那些命名回调函数。 – WTK

+0

名称功能...这是一个函数分配给var吗?然后使用.call()方法? – Bjarne77