2017-08-13 43 views
0

我有一個ajax函數返回一個項目列表。然後我會獲取這些物品的一些定價信息。價格信息來自外部資源,速度有點慢,所以我總是加載這些項目來進行適當的DOM更改,然後獲取價格。問題是我需要延遲價格通話。我要的是如下:setTimeout與一堆函數調用

loadPricesDelayed 
delay 5sec 
loadPricesDelayed 
delay 5sec 
loadPricesDelayed 
delay 5sec 
loadPricesDelayed 

什麼我現在是這樣的:

 $.each(jsonObject, function (i, obj) { 
      *** 
      loadPrices(obj.prod, obj.mfg); 
      *** 
     } 

     function loadPrices(cardName, setName) { 
      if (outstandingPricesToFetch == 1) 
       setTimeout(function() { loadPricesDelayed(prod, mfg) }, 5000); 
      else { 
       outstandingPricesToFetch = 1; 
       loadPricesDelayed(prod, mfg);    
      }    
     } 

     var outstandingPricesToFetch; 

     function loadPricesDelayed(prod, mfg) { 
      **** 
     } 

(outstandingPricesToFetch得到重置前$。每防止延遲上的第一次提取)

這代碼結果如下

loadPricesDelayed 
delay 5sec 
loadPricesDelayed 
loadPricesDelayed 
loadPricesDelayed 

我該如何按預期打破延遲?

+0

您是否需要**在各種調用之間延遲5秒鐘,還是隻是爲了讓數據有足夠的時間來處理?因爲如果你只是想確保數據在**函數後返回**,你將受益於**回調** :) –

+0

或者使用[promise](https://api.jquery.com/promise /)鏈。 jQuery有它內置的,或者你可以使用一個單獨的庫,如[藍鳥](http://bluebirdjs.com/docs/getting-started.html)。 – Laoujin

+0

由於來自外部資源的需求而特別創建延遲。我們已經從他們的CDN觸發DDOS保護的大樣本集 –

回答

0

請使用下面的代碼,它將延遲時間乘以獲得所需的結果。

$.each(jsonObject, function (i, obj) { 
      *** 
      loadPrices(obj.prod, obj.mfg,i);//**change** 
      *** 
     } 

     function loadPrices(cardName, setName,i) {//**change** 
      if (outstandingPricesToFetch == 1) 
       setTimeout(function() { loadPricesDelayed(prod, mfg) }, 5000*i);//change 
      else { 
       outstandingPricesToFetch = 1; 
       loadPricesDelayed(prod, mfg);    
      }    
     } 

     var outstandingPricesToFetch; 

     function loadPricesDelayed(prod, mfg) { 
      **** 
     } 

上面的代碼將在0,5,10,15,20第二次火災loadPricesDelayed。

+0

對不起,但我建議不要使用setTimeout來控制流量。除非這是一個寵物項目,否則使用回調,承諾,rxjs或異步/等待。 – Laoujin

+0

我同意你所說的,但還是認爲至少在函數調用之間提供了平分時延的解決方案,但是我又完全同意你所說的,因爲我們不能保證加載...會在5秒內給出響應 –