簡體   English   中英

Javascript方法鏈接

[英]Javascript method chaining

不知道怎么回事。

假設我有一個JavaScript方法來進行一些AJAX調用:

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

在完成所有AJAX調用之前,我不希望執行下一個函數。 我也不想將下一個函數調用放入AJAX調用的成功回調中。

有沒有一種方法可以鏈接這些,所以在makeAJAXCalls()完成所需的一切之前,下一個函數不會被調用?

你可以使用jQuery的$.when() 功能

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

如果您希望首先完成所有這些功能,您甚至可以添加多個功能。 這些都稱為延遲對象

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();
    }
}

這使得調用異步,這可能是這里的意圖。

你真的限制你的選擇。 AJAX本質上是異步的(除非你使用synchronized xhrs,因為它們會凍結瀏覽器而你不想要它)。 因此,您唯一的選擇是在回調中處理它,因為回調是您知道請求已完成的唯一方式,以及請求中的數據在完成時傳遞的位置。

因為你有多個回調,並且你想等到它們全部完成,你可以在所有回調中放置相同的函數調用,並且該函數可以跟蹤哪些響應已經返回,並且只有在所有響應都存在時才進行。

所以你可以做點什么

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

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

然后在makeAllRequests方法中使用syncer

您可以通過使您的呼叫同步。

示例:同步請求

雖然您可能需要注意,這可能會對您的應用程序的其余部分造成不希望的阻塞效果,這可能會對使用同步xhr的原因產生疑問。

如果您使用的是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);

您應該將自己的回調作為函數的參數。
這樣,調用者可以決定下一步該做什么。

您還可以返回Deferred對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM