2017-09-23 34 views
-2

我想給我的發送消息系統添加一個1秒的冷卻時間(例如,你可以每秒發送1條消息)。所以我最初的想法是簡單地創建一個超時,並在嘗試發送來檢查它是否仍然存在之前。原來,這比我預想的要更多的代碼。最簡單的不可撤銷的時光/冷卻功能?

有什麼我在這裏失蹤?是不是有那樣簡單的東西:

//inside some message sending function 
if(!mySuperCooldown) 
{ 
    //send message 
    mySuperCooldown = cooldown(1000); 
} 

一切我成功地構建最終以線負荷,爲某個人想到過在我看來。謝謝你,原諒我的文盲。

回答

2

有一個允許發送消息的標誌,並在發送消息時將其設置爲false。然後將超時設置爲1000毫秒,將標誌重置爲真。

var allowMessage = true; 
function sendMessage(msg) { 
    if (allowMessage) { 
     //do something 
     allowMessage = false; 
     setTimeout(() => allowMessage = true, 1000); 
    } 
} 
+0

啊,謝謝。我不知道你可以在超時時間內以這種格式添加一個函數。將在8分鐘內接受。 –

+0

np。箭頭函數是es6的一個特性,所以如果你需要定位es5,你可以使用setTimeout(function(){allowMessage = true;},1000); –

+0

你無法想象我爲了某些其他事件而做出的怪異表演。 –

2

做一個高階函數,把一個正常的功能於一體,其速率限制:

function rate_limit(delay, func) { 
    var last_call = null; 

    return function() { 
     if (last_call && (Date.now() - last_call <= delay)) { 
      return; 
     } 

     last_call = Date.now(); 

     return func(); 
    }; 
} 

然後,您可以速率限制任何功能:

var my_function = rate_limit(1000, function() { 
    console.log('foo'); 
}); 

運行my_function()只會每秒調用一次您的原始功能。