2013-01-14 23 views
3

我正在使用MySQL存儲數據並每隔幾分鐘向URL發送請求。如何殺死特定項目(nodejs)的setInterval(clearInterval)

通過使用setInterval()每分鐘運行一次sendRequest函數來查詢一次URL表,並重新發送每個請求。

事情是,如果一個URL從數據庫中刪除,它仍然繼續發送請求,因爲我沒有在每個請求之前查詢數據庫(並且我的函數不知道該記錄被刪除)。

而且,我不想在每次請求之前查詢相關的數據庫記錄,因爲這是一個矯枉過正(有很多記錄)。

因此,我願意每分鐘查詢一次數據庫以查找所有已刪除的記錄,並清除已刪除的記錄。因此,我不需要爲每條記錄查詢每分鐘,而是每分鐘查詢一次更新記錄(如果我有一百萬個URL,則每分鐘最多隻有一個查詢,而不是每分鐘一百萬個查詢)。

但是,讓我們說,我的查詢告訴我,數據庫記錄1,3和6被刪除,我怎麼能clearInterval只有他們?

回答

1

您可以將鏈接到記錄ID中的對象的超時標識:

var recordIntervals = {}; 

recordIntervals[recordId] = setInterval(queryRecordId, time); 

但是這可能不是一個好主意。我要做的事情是每分鐘只運行一次間隔,查詢數據庫,然後將請求發送到數據庫給我的任何URL。

setInterval(function() { 
    var urls = db.query('SELECT * from URLs'); 
    urls.forEach(function (url) { 
    sendRequest(url); 
    }); 
}, oneMinute); 
0

您CAND使用2個陣列(或jsons的陣列與2個陣列):用於存儲所述網址的一個和一個用於存儲所述間隔

例1

nrRequests = 1; 
urls[nrRequests] = url; 
requests[nrRequests] = setInterval(function(){},1000); 
nrRequests++; 

例2

var requests = []; 
var interval = setInterval... 
var url = get url.. 
requests.push({ 
    interval : interval, 
    url: url 
}); 

///刪除的網址: 搜索ur LS並找到索引,之後清除時間間隔的要求[nrRequests]設置

for(var item in requests) 
{ 
    if(requests[item][url]==deletedurl) 
    { 
     clearInterval(requests[item][interval]); 
     delete requests[item]; 
    } 
} 
1

好像我這樣解決的:

定義了的setInterval(使用var名稱,如url6,URL5 ..)作爲

全球[ '網址' URLID +] = setInterval的.. ...

而且,用更新的記錄查詢每分鐘,被叫clearInterval對於定義的記錄:

clearInterval(全球[ '網址' URLID +]);

在提問時,我實際上是在尋找一個像@juandopazo和@George建議的模式,並接受@juandopazo的答案,因爲這是第一個答案。非常感謝。