有没有一种方法可以使用setTimeout向我的代码添加冷却时间,以使人们不会向该命令发送垃圾邮件?

时间:2020-10-21 05:58:10

标签: javascript discord discord.js

我只希望有一种方法可以在用户尝试运行它时为其添加15分钟的冷却时间...。

如果命令处于冷却状态,是否可以发送诸如'您处于(持续时间)的冷却时间之类的消息'

我现在拥有的代码

from scrapy.loader import ItemLoader
from digikala.items import DigikalaItem

class PromotionsSpider(scrapy.Spider):
    name= 'promotions'
    allowed_domains=['www.digikala.com']

def start_requests(self):
    yield scrapy.Request(url= 'https://www.digikala.com/search/category-book/?type[0]=4844&pageno=1&last_filter=type&last_value=4844&sortby=4',
        callback= self.parse)

def parse(self, response):
    
    star=0
    
    for product in response.xpath("//ul[@class='c-listing__items']/li"):
            

        title= product.xpath(".//a[@class='js-product-url']/text()").get()
        if product.xpath(".//div[@class='c-product-box__engagement-rating']/text()"):
            star= float(str(product.xpath(".//div[@class='c-product-box__engagement-rating']/text()").get()))
        else:
            star=0
            
            
        loader=ItemLoader(item=DigikalaItem(), selector=product)
        absolute_url=product.xpath(".//a[@class='c-product-box__img c-promotion-box__image js-url js-product-item js-product-url']/img/@src").extract_first()
        loader.add_value('image_urls', absolute_url)
        image=loader.load_item()
        if star>=3.5 and (discounted_amount>=5000 or discounted_percent>=10):
            yield{
                'image':image,
                'title':title,
                'star':star
            }

3 个答案:

答案 0 :(得分:1)

我认为您可以使用promise进行顺序处理和冷却:

var delay = function(s){
    return new Promise(function(resolve,reject){
     setTimeout(resolve,s); 
    });
  };
  delay().then(function(){
    return delay(3000); // delay 3 sec
  }).then(DoingSmth());

答案 1 :(得分:0)

您可以将上一个操作的时间戳记保存在变量中,并检查从现在到最后一个时间戳记之间经过的时间

let lastActionTime = new Date();

let cooldown = () => {
let timeElapsed;
let now = new Date();
//get the actual time elapsed in ms
timeElapsed = now - lastActionTime;
//check if the time elapsed is less than 15 minute or not
if(timeElapsed < 900000){
//if yes, return message with remaining time in seconds
console.log(`You are on cooldown, remaining time ${(900000-timeElapsed)/1000} seconds`);
} else {
//Do the requested action and re-assign the lastActionTime
console.log(`Hurray`);
lastActionTime = new Date();
}
}

答案 2 :(得分:0)

在SPA(单页应用程序)中执行此操作的正确方法是将过期时间保存为全局状态(例如,React中的Redux)-这样,用户可以浏览页面,并且“倒数”会仍然可以工作

如果您的应用不是SPA,则可以将到期日期保存在数据库中。

关于建议在同一页面上实现该功能的其他答案-不能期望用户在同一页面上停留15分钟。