2017-01-09 20 views
0

前段時間我在回家測試中遇到了一個代碼問題。這是如下:如何模擬JavaScript中的數據庫調節?

數據庫節流

您正在給定的用戶數據的陣列USERINFO和功能updatedb的採用單個用戶數據的參數。 updateDB進行異步調用,解析用戶數據並將解析的數據插入到數據庫中。該數據庫節流請求,以便確保所有的用戶數據被添加到數據庫中,我們需要一個函數addAllUserData是在USERINFO每個條目確保永遠不會調用updatedb的超過每秒7個呼叫防止被節流。

var userInfo = [{'name':'antonio', 'username':'antonio_pavicevac_ortiz'}], dataBase = []; 

function updateDB(singleUserDataArgument, callback){ 
    dataBase.push(callback(singleUserDataArgument)); 
} 

function addAllUserInfo(data) { 
    var eachUserData; 
    setInterval(function(){ 
     eachUserData = data.map(data) 
    }, 7000); 
} 

你可以通過我的努力,我有一個很難包裝我的頭圍繞這個練習看看。任何人都可以注入對異步調用的限制意味着什麼?

在此先感謝!

+2

我不認爲從抽象的角度來看,節流與異步有什麼關係。數據庫不會接受來自客戶端的每秒多於7次的呼叫,否則它可能會在每秒七次的限制內丟棄額外的請求。 因此,您可以跟蹤您每秒撥打多少電話或撥打七個電話,等待一秒鐘,再撥七個電話等。 – mrogers

+0

感謝Mrogers!那麼在這個例子中,他們基本上是通過期望你以某種方式注入setInterval來推斷節流? –

+1

我會假設他們會標記一個答案,可以每秒發送超過七個請求到數據庫。所以是的,你可以用setInterval或者其他一些JS函數來完成。 – mrogers

回答

2
// contains times at which requests were made 
var callTimes = []; 

function doThrottle(){ 
    // get the current time 
    var time - new Date().getTime(); 

    // filter callTimes to only include requests this second 
    callTimes = callTimes.filter(function(t){ 
    return t > time-1000; 
    }); 

    // if there were more than 7 calls this second, do not make another one 
    if(callTimes.length > 7) return true; 

    else{ 
    // safe, do not throttle 
    callTimes.push(time); 
    return false; 
    } 
} 

// use like this 
function makeRequest(){ 
    if(doThrottle()){ /* too many requests, throttle */ } 
    else{ /* it's safe, make the ajax call*/ } 
}