2017-01-29 75 views
0

我有下面的代碼 JS的setInterval被稱爲多次

if (input.isValidLink()) { 
    store() 
    .then(db => db.update(message.from, text, json)) 
    .then(value => value.selectAllFromDB()) 
    .then(users => makeRequest(users)); 
} 

的AMD makeRequest的功能

makeRequest(user) { 
    setInterval(() => { 
    users.forEach(user => { 
     httpRequest(user.json); 
    }); 
    }, 10000); 
} 

我想要做的,是用戶的selectAllFromDB function回報陣列從數據庫,它作爲參數傳遞給makeRequest function,它循環通過每個用戶,發送請求接收json數據並每10秒做一次,所以它不會錯過任何更改。每當有用戶發送鏈接時,它也應該開始觀看這個鏈接。問題在於,在每個接收到的鏈接上,它會調用makeRequest function,這會產生另一個間隔,如果收到兩個鏈接,我會有兩個間隔。第一循環通過這個數組

[{ 
    id: 1234, 
    json: 'https://helloworld.com.json', 
}] 

其次通過這個

[{ 
    id: 1234, 
    json: 'https://helloworld.com.json', 
}, { 
    id: 5678, 
    json: 'https://anotherlink.com.json', 
}] 

有什麼辦法這個可以固定所以只有一個間隔將被創造出來的?

+1

一般提示:一個setInterval你不存儲返回值以便能夠稍後取消它幾乎總是一個錯誤。在你的情況下,你可能應該取消最後的時間間隔並創建一次。 – Matthias247

回答

1

你需要做這樣的事情,以確保您只能創建一個區間,總是使用最新的用戶列表:

let latestUsers; 
let intervalId; 
const makeRequest = (users) => { 
    latestUsers = users; 

    if (!intervalId) { 
    intervalId = setInterval(() => { 
     latestUsers.forEach(user => { 
     httpRequest(user.json); 
     }); 
    }, 10000); 
    } 
} 

如果你不想變量左右浮動,你可以使用可自調用函數保持包裝很好:

const makeRequest = (() => { 
    let latestUsers; 
    let intervalId; 
    return (users) => { 
    latestUsers = users; 

    if (!intervalId) { 
     intervalId = setInterval(() => { 
     latestUsers.forEach(user => { 
      httpRequest(user.json); 
     }); 
     }, 10000); 
    } 
    } 
})();