2013-11-14 143 views
0

我正在使用jQuery,然後按順序加載我的腳本。然而,服務器CPU上的即時轟擊仍然太高。我曾嘗試加入.delay像這樣的。那麼之後:Jquery:然後添加延遲

siteVisits() 
    .then(siteTerms) 
    .delay(30000) 
    .then(siteSources) 
    .delay(30000) 
    .then(siteBrowsers) 
    .delay(30000) 
    .then(siteCountries) 
    .delay(30000) 
    .then(siteContent); 

但是我得到這個錯誤:

Uncaught TypeError: Object #<Object> has no method 'delay' 

有沒有人有我如何可以將每個功能之前的延遲任何想法叫?

在此先感謝

+2

延遲只適用於動畫。你不能在任何地方使用它。我很好奇,看看這是怎麼回事,因爲將延遲(setTimeout)引入以這種方式鏈接的函數是很困難的。 – Archer

+0

我從錯誤中收集了這些信息,當我說'如何在每個函數被調用之前添加延遲'我的意思是任何人都有任何想法如何實現這個另一種方式? – MarkP

+0

我會研究那些對服務器來說過於密集的功能,並優化它們。等待2分鐘讓頁面完全加載(因爲如果代碼工作,您的代碼將完成)不是一個可接受的解決方案。 –

回答

0

這不像.delay的行爲,應使用只能延緩動畫,對於這種˚F延遲,你將不得不使用的setTimeout();

siteVisits() 
    .then(function() { 
     setTimeout(function() { 
      siteTerms.then(function() { 
       setTimeout(function() { 
        siteTerms.then() 
       }, 30000); 
      }) 
     }, 30000); 
    }); 

但是爲什麼這麼拖延?

0

這裏使用延遲是錯誤的,它們是爲完全不同的問題而創建的。不要因爲你喜歡花哨的語法而拖延他們。

function DelayedExecutor(delay) { 
    var self = this, queue = [], id; 

    function runNext() { 
     var def = queue.shift(); 
     if (def && typeof def.func === "function") { 
      def.func.apply(def.context, def.args); 
     } 
     if (queue.length === 0) { 
      id = clearInterval(id); 
     } 
    } 

    this.add = function (func, args, context) { 
     queue.push({func: func, args: args, context: context}); 
     if (!id) { 
      id = setInterval(runNext, delay); 
      runNext(); 
     } 
     return self; 
    }; 
} 

var de = new DelayedExecutor(30000); /* new and improved model! */ 
de.add(siteTerms /*, [arguments], thisArg */); 
de.add(siteSources); 
de.add(siteBrowsers).add(siteCountries).add(siteContent);