Javascript方法链接

时间:2011-05-19 20:08:56

标签: javascript

不知道怎么回事。

假设我有一个JavaScript方法可以进行一些AJAX调用:

function makeAJAXCalls()
{
    // who knows how long this will take
}

在完成所有AJAX调用之前,我不希望执行下一个函数。我也不想将下一个函数调用放入AJAX调用的成功回调中。

有没有一种方法可以将这些链接起来,所以在makeAJAXCalls()完成它需要做的所有事情之前,下一个函数不会被调用?

6 个答案:

答案 0 :(得分:3)

您可以使用jQuery的$.when() functionality

$.when(makeAjaxCalls()).done(function () { 
   // Do other things here 
});

如果您希望首先完成所有这些功能,您甚至可以添加多个功能。这些都称为Deferred Objects

答案 1 :(得分:1)

你真的限制了你的选择。 AJAX本质上是异步的(除非你使用synchronized xhrs,因为它们会冻结浏览器而你不想要它)。因此,您唯一的选择是在回调中处理它,因为回调是您知道请求已完成的唯一方式,以及请求中的数据在完成时传递的位置。

因为你有多个回调,并且你想等到它们全部完成,你可以在所有回调中放入相同的函数调用,并且该函数可以跟踪哪些响应已经返回,并且只有在所有响应都是那里。

所以你可以做点什么

var resultsHolder = [];
var syncer = function(response){
    // add results to resultsHolder on call

    if (resultsHolder.lengh === numberExpected) {
     //proceed
    }
}

然后在makeAllRequests方法中使用syncer

答案 2 :(得分:1)

您可以通过同步拨打电话。

Example: Synchronous request

虽然您可能需要注意,这可能会对应用程序的其余部分造成不良阻塞效果,这可能会对使用同步xhr的原因产生疑问。

答案 3 :(得分:1)

如果您使用的是jQuery 1.5+,则可以进行链式ajax调用。这是有效的,因为$.ajax()会返回jqXHR,这也是Deferred Object

function makeAjaxCalls()
{
    return $.ajax(/* snip options */);
}

function handleSuccess(data)
{
    // do something with the data
}

function nextAjax()
{
    return $.ajax(/* snip other options */);
}

// then...
makeAjaxCalls().success(handleSuccess).complete(nextAjax);

答案 4 :(得分:1)

var queueCount =0;
function makeAjaxCalls()
{
    queueCount+=7; // or however many calls you need to make.
    // make your ajax calls. onSuccess (or failure), call checkQueue();
}
function checkQueue()
{
    queueCount--;
    if (queueCount <=0)
    {
       doNext();
    }
}

这使得调用异步,这可能就是这里的意图。

答案 5 :(得分:0)

您应该将自己的回调作为该功能的参数 这样,调用者就可以决定下一步该做什么。

您还可以返回Deferred个对象。