簡體   English   中英

jQuery-對一個AJAX調用的多功能調用

[英]Jquery - Multiple function calls to one AJAX call

我有一個頁面,該頁面應在初始頁面加載一些通過AJAX的數據之后加載,然后將其用於一些功能。

到目前為止,我只能使它與單獨加載AJAX請求一起工作(這意味着同一請求被調用了30次)

我需要的是可能具有可以多次調用的功能,但是只能激活一次AJAX調用,而其他時候卻可以返回數據,而不必再次執行已經使數據重新運行的同一AJAX調用(這是多余的)並且不需要,數據不會更改)。

現在,我可以通過簡單地進行調用並將其存儲在全局變量中,然后僅檢查此變量中是否有內容來做到這一點...

但! 問題是,但是,大約20個需要AJAX傳遞信息的調用在加載DOM之后立即發生,並且與AJAX調用一起發生。

因此,我無法執行此操作,因為20個請求是在第一個AJAX調用甚至還沒有顯示完所有數據之前發生的。

我試圖用“延遲”的JQueries做一些事情,但是只能設法通過一個調用而不是同時進行多個調用來做到這一點,而這不會每次都觸發AJAX調用。

但是我敢肯定這一定有可能! 很好,沒有任何循環和超時。 我真的很喜歡部分加載頁面和部分頁面的想法。 輸入字段不是從一開始就加載的,而是在准備就緒后立即交付,等等。

是嗎? 我真的無法繞過這個...

$(function(){
    loadme1();
    loadme2(); /* loaded from complete different parts in the code, so not possible to start loadme2 only after loadme1 has everything finished */
});

function getData(){ 
    return $.get("/pathtogetthedata", {}, function(data){

    });
}

function loadme1(){
    getData().done(function(data){           
        var obj = $.parseJSON(data); 
        /* do something with obj */
    }
}
function loadme2(){
    getData().done(function(data){ //please just wait till the first call to the same method finished and give me that data or wait till it's in a global variable and I take it from there. Only make a call if there is no jquery "promise" waiting    
        var obj = $.parseJSON(data); 
        /* do something with obj */
    }
}

您必須保留所有“回調”,然后在數據准備就緒時,調用剛剛保存的回調,例如:

var funcs = []

function exampleOfAjaxGetData(callback) {
    funcs.push(callback)
    if (funcs.length == 1) {
        setTimeout(function() {
            alert('This is need to be called once1')
            while (funcs.length > 0)
                funcs.pop()('The data return from ajax')
        }, 2000)
    }
}


exampleOfAjaxGetData(function(x) {
    alert('I got the data:' + x)
})

exampleOfAjaxGetData(function(x) {
    alert('I got the data:' + x)
})

jsFiddle: http : //jsfiddle.net/yn5ayw30/

在示例中,我向您展示了一個需要2秒才能完成的功能。 我兩次調用了該函數。 但是“ setTimeout”僅運行一次。 setTimeout完成后,它將運行所有等待答案的功能。

我可以想到一個解決方案是:

var adata = -1; // global variable data holder

function getdata()
{
    //if ajaxx call is already done and completed then return data
    if(adata != -1 && adata != -2)return adata;

    if(adata == -1) 
    {
        //function getting called first time

        adata = -2; // now we change value of adata to -2
        // we will use this -2 to check if ajaxx call is stil running
        //do ajaxx $.get call
        $.get( "url_goes_here", function( data ) {
            adata = data;// assingh received data to adata, so -2 is changed now
        });
        //now code will move to while loop part even after first call as while loop part doesn't have condition
        //thus waiting for ajaxx call to be completed even if its first call
    }
    while(adata == -2){ 
        //just a loop to delay output until call finishes
    }
    return adata;

}

現在您可以使用getdata()函數來實現所需的功能

var getDataCalled = false;
var deferred = $.Deferred();
function getData(){ 
    if(!getDataCalled) {
        getDataCalled = true;
        return $.get("/", {} , function(data) {
              deferred.resolve(data);
        });
    } else {
         console.log("returning deferred");
         return deferred;  
    }
}

第一次調用“ getData”函數時如何保存。 當它已經被調用時,您可以返回自己的“ deferred”對象,並在您的第一個ajax請求完成時對其進行解析。 我希望這個簡短的代碼片段能說明一切,並且易於理解。

現在,調用getData()首先會發出ajax請求,然后始終返回您自己創建的延遲對象。

getData().done(function(data) {
  console.log(data);
});
getData().done(function(data) {
  console.log(data);
});
getData().done(function(data) {
  console.log(data);
});

您將看到只有一個ajax請求。

暫無
暫無

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

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