我有以下功能:
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上做同样的事情吗?)
答案 0 :(得分:2)
您要求的是从服务器端强制执行的操作。由于客户可以随时从任何设备登录(如您所述),因此无法在客户端进行维护。
您想要的是以某种方式维护所有客户的状态。您需要使用cookies
或session
来执行此操作,因为这些提供了不同客户端和服务器之间的状态共享。由于只有一台服务器(理论上),因此可以对其进行编程以了解是否在一天内为用户执行了操作。然后,可以通过session
/ cookie
注意: 这是假设您拥有可以在服务器和客户端之间共享的某种身份验证/会话。否则,当您从不同设备/浏览器打开客户端时,服务器无法识别您
该过程如下:
functionTriggered
是否为真。如果否,则在auth响应中,服务器发送functionTriggered=false
标志(在客户端设置cookie)functionTriggered=true
functionTriggered=true
,因此发送此标志。服务器设置一个cookie来指示这一点客户端看到这个并跳过AJAX请求。答案 1 :(得分:1)
我同意@DustinToothless,但与Dustin所说的相反,我建议单独调用(将事物分开并维护软件工程主体)给服务器,询问是否可以发送AJAX调用。但是,服务器会根据先前是否收到请求做出决定 - 可以通过使用数据库或使用比较上次修改日期的文件(这样您也可以记录)来完成 - 如果它已经收到一个请求,然后服务器会给OK执行AJAX调用。
虽然上述方法可行,但由于客户端可能会发送AJAX请求而无论服务器说什么(即黑客可能导致DoS攻击),因此无效或安全,因此,您应该只使用一个函数(这呼叫甚至)让服务器决定(使用上述方法)是否发送电子邮件。