检测函数是否已执行

时间:2016-09-23 20:15:14

标签: javascript jquery

我有以下功能:

function enviarMail() {
    for (var x = 1; x <= idShort; x++) {
        var nume = $('#Num' + x).text();
        var purp = $('#Pur' + x).text();
        var open = $('#Open' + x).text();
        var close = $('#Close' + x).text();
        var owner = $('#Owner' + x).text();
        var fam = $('#Fam' + x).text();
        var vs = $('#Vs' + x).text();
        var sta = $('#Sta' + x).text();
        var mail = $('#Mail' + x).text();    

            $.ajax({
                type: 'POST', //POST | GET
                url: urlServer + 'ws_alerts.asmx/SendMailExp',
                data: '{"us":"' + owner +
                    '","email":"' + mail +
                    '","vs":"' + vs +
                    '","fam":"' + fam +
                    '","pur":"' + purp +
                    '","open":"' + open +
                    '","close":"' + close +
                    '","id":"' + nume + '"}', 
                dataType: 'json',
                contentType: 'application/json',
                timeout: 600000,
                error: function (xhr) {
                    bootbox.alert("No se pudo enviar el correo.");
                },
                success: function (data) {

                }
            });
    }
}

我在(文档).ready上调用此函数,工作正常!但我只想执行此功能一次,例如我在上午8:00登录该功能将被执行,然后如果我在上午9:15再次登录该功能将再次执行,我不想要我的电子邮件充满了这封邮件,所以我的问题是如何每天1次执行该功能。

PD。功能在主页面上执行,因此很多用户可以执行该功能,但我只想执行它一次不管用户做什么。

PD2。我在计时器中思考,但用户可以从任何设备访问,所以我不知道这是否可行(例如我从我的PC登录并启动计时器,然后我从我的平板电脑登录计时器会发生什么?我还有另外一次从PC上做同样的事情吗?)

2 个答案:

答案 0 :(得分:2)

您要求的是从服务器端强制执行的操作。由于客户可以随时从任何设备登录(如您所述),因此无法在客户端进行维护。

您想要的是以某种方式维护所有客户的状态。您需要使用cookiessession来执行此操作,因为这些提供了不同客户端和服务器之间的状态共享。由于只有一台服务器(理论上),因此可以对其进行编程以了解是否在一天内为用户执行了操作。然后,可以通过session / cookie

将此标记分享给所有客户

注意: 这是假设您拥有可以在服务器和客户端之间共享的某种身份验证/会话。否则,当您从不同设备/浏览器打开客户端时,服务器无法识别您

该过程如下:

  • 用户从ClientA登录。在服务器端,(在内存存储中,如Redis或Memcache,或在数据库中),服务器检查用户的id以查看functionTriggered是否为真。如果否,则在auth响应中,服务器发送functionTriggered=false标志(在客户端设置cookie)
  • ClientA进行AJAX调用,服务器在商店中设置functionTriggered=true
  • 用户从ClientB登录。登录后,服务器会看到functionTriggered=true,因此发送此标志。服务器设置一个cookie来指示这一点客户端看到这个并跳过AJAX请求。

答案 1 :(得分:1)

我同意@DustinToothless,但与Dustin所说的相反,我建议单独调用(将事物分开并维护软件工程主体)给服务器,询问是否可以发送AJAX调用。但是,服务器会根据先前是否收到请求做出决定 - 可以通过使用数据库或使用比较上次修改日期的文件(这样您也可以记录)来完成 - 如果它已经收到一个请求,然后服务器会给OK执行AJAX调用。

虽然上述方法可行,但由于客户端可能会发送AJAX请求而无论服务器说什么(即黑客可能导致DoS攻击),因此无效或安全,因此,您应该只使用一个函数(这呼叫甚至)让服务器决定(使用上述方法)是否发送电子邮件。