2012-03-01 46 views
0

我有一個異步Ajax函數,它在服務器端運行命令字符串並將結果返回給客戶端。它調用回調來處理結果。異步調用後設置計時器返回

function ajaxCall(commandStr,callback){ 
    var url=......//make a url with the command string 
    jquery.get(url,function(result){ 
     //process the result using callback 
     callback(result); 
    }); 
} 

異步調用(AjaxCall的)可以採取以完成一段時間,但我希望它的間隔(1000毫秒)之後執行相同的命令。

我想編寫一個函數,是這樣的:

function ajaxCallRepeated(interval,commandStr,callback) 

我試圖關閉就像這樣:

function ajaxCallRepeated(interval,commandStr,callback){ 
    //This feature uses closures in Javascript. Please read this to know why and how: http://jibbering.com/faq/notes/closures/#clSto 
    function callLater(param1,param2,param3){ 
     return (function(){ 
      ajaxCall(param2,function(out,err){ 
       if(param3)param3(out,err); 
       var functRef = callLater(param1,param2,param3); 
       setTimeout(functRef, interval); 
      }); 
     }); 
    } 
    //the first call 
    var functRef = callLater(interval,commandStr,callback); 
    setTimeout(functRef, interval); 
} 

然後我把它稱爲是這樣的:

ajaxCallRepeated(2000,"ls",function(result){ 
    alert(result); 
}); 

但它只運行該命令2次。 如何編寫一個函數,在它被稱爲異步函數的回調後重新調度自己?

PS。在上一個完成後,我想發起另一個Ajax調用。另外,值得一提的是,axashCallRepeated()會被各種參數調用,所以幾個Ajax調用並行運行,但是對於每個commandStr,只有一個Ajax調用正在進行,在Ajax調用返回之後,另一個將會在X秒後被解僱。

+0

讓我得到這個直。您希望使用您的回調計劃新的ajax調用,以便每X秒觸發一次**,而不管前一個ajax調用可能尚未完成的事實,還是您希望按順序觸發ajax調用(在之前的一個之後激發另一個調用完成)? – WTK 2012-03-01 09:02:38

+0

我想在上一個Ajax調用完成後再觸發另一個Ajax調用。另外,值得一提的是,axashCallRepeated()會被各種參數調用,所以幾個Ajax調用並行運行,但是對於每個commandStr,只有一個Ajax調用正在進行,在Ajax調用返回之後,另一個將會在X秒後被解僱。 – AlexStack 2012-03-01 09:06:06

+0

當第一個Ajax調用完成時,我會觸發一個自定義事件,然後執行第二個Ajax調用! – 2012-03-01 09:11:13

回答

1

我不會使用setTimeout來觸發第二個Ajax調用!因爲你永遠不知道需要多久,如果它完成!
至於你標記你的問題的權利,你是使用jQuery的你應該考慮這樣的事情:

$.ajax({ 
    type: 'POST', 
    url: url, 
    data: data, 
    success: function(){ 
    // The AJAX is successfully done, now you trigger your custom event: 
    $(document).trigger('myAjaxHasCompleted'); 
    }, 
    dataType: dataType 
}); 

$(function(){ 
    //somehwere in your document ready block 
    $(document).on("myAjaxHasCompleted",function(){ 
     $.ajax({ 
      //execute the second one 
     }); 
    }); 
}); 

因此,這將確保ajax開機自檢完成併成功,現在你可以執行第二個。我知道它不是你問題的確切答案,但你應該考慮使用這樣的東西!將使它更安全我猜:-)

+1

好主意,但您可能需要將其他數據傳遞給您的自定義事件(如我們示例中的命令)以瞭解已完成ajax調用的命令。 – WTK 2012-03-01 09:22:49

+0

我同意!但我的答案應該被視爲暗示它可以這樣做,我想他會認識到這一點:-) – 2012-03-01 09:27:02

+0

是的,我最近通過自定義事件過來了這種方式!我也在某些項目中使用setTimeout來確保我的ajax調用已經完成,但那不是安全的方式,也沒有乾淨的解決方案,所以不應該這樣做,因爲有更好的方法來做到這一點:) – 2012-03-01 09:28:57

0

解決這個問題的關鍵是要保存到封閉自身的引用,並用它安排在下次調用時:

function ajaxCallRepeated(interval,commandStr,callback){ 
    //This feature uses closures in Javascript. Please read this to know why and how: http://jibbering.com/faq/notes/closures/#clSto 
    function callLater(_interval,_commandString,_callback){ 
     var closure=(function(){ 
      ajaxCall(_commandString,function(out,err){ 
       if(_callback)_callback(out,err); 
       setTimeout(closure,_interval); 
      }); 
     }); 
     return closure; 
    } 
    //now make a closure for every call to this function 
    var functRef = callLater(interval,commandString,callback); 
    //the first call 
    functRef(); 
} 
+0

如果您對自己的答案感到滿意,請記住接受它,因此您的問題不會列爲「未答覆」。謝謝! – WTK 2012-03-01 09:32:56

+0

我試過了,但它說在詢問問題後兩天內我不能接受我自己的答案。它有助於對它進行投票,這樣它就會上升,人們會發現它有一個很好的答案。雖然我不能投票自己的答案。 – AlexStack 2012-03-01 10:46:04

0

變得更容易推理如果你分開了一些東西。

例如,重複的邏輯不必知道AJAX或回調都:

function mkRepeater(interval, fn, fnScope, fnArgs) { 
    var running; 

    function repeat() { 
    if (!running) return; 
    fn.apply(fnScope, fnArgs); 
    setTimeout(repeat, interval); 
    } 

    return { 
    start: function() { running = true; repeat(); }, 
    stop: function() { running = false; } 
    }; 
} 

您可以使用它像這樣:

var r = mkRepeater(2000, ajaxFunction, this, ["getStuff", callbackFn]); 
r.start(); 
... 
r.stop(); 
+0

每次調用mkRepeater()時,repeat()對interval,fn,fnScope,fnArgs使用相同的值。我需要並行運行多個呼叫。 – AlexStack 2012-03-01 10:50:35

+0

你需要撥打幾個*不同的*電話,但你需要錯開它們? – Deestan 2012-03-01 11:03:12