2016-09-23 4 views
0

を実行された場合、私は、次の機能を持たせて検出:私は(ドキュメント).readyにこの関数を呼び出す機能が

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) { 

       } 
      }); 
    } 
} 

を、正常に動作します!しかし、私はこの機能を1回だけ実行したいと思います。例えば、私が8:00にログインすると、関数が実行されます。そして、再び9:15にログインすると、関数は再び実行され、私はこのメールがいっぱいの電子メールなので、1日1回の機能を実行するにはどうすればいいですか?

PD。機能はメインページで実行されるので、多くのユーザーがその機能を実行できますが、実行するのは1回だけで、どのユーザーがそれを行うかは関係ありません。

PD2。私はタイマーで考えていましたが、ユーザーはどんなデバイスからでもアクセスできるので、これが機能するかどうかはわかりません(たとえば、PCからログインしてタイマーを開始した後、自分のタブレットからログインしますタイマーは?私は別の時間がPCから同じになるだろうか?)

+2

すべてのユーザーに対して1回だけ実行し、各ユーザーに対して1回実行しないでください。サーバー上で状態を維持する必要があります。この関数は、他のユーザーがその日に関数を実行したかどうかを調べるためにAJAX呼び出しを実行する必要があります。 – Barmar

+0

あなたの要件では、バックエンドスクリプトとDBまたはcronジョブと一緒にこれを行う必要があると思います。 –

+0

これにはサーバーが必要です。あなたはアプリケーションサーバーを持っていますか? – trincot

答えて

2

あなたが求めているのは、サーバー側から強制する必要があります。クライアントは、任意のデバイスからいつでもログインすることができます(上記のように)、クライアント側でこれを維持することはできません。

あなたがしたいのは、どうにかしてすべてのクライアントで状態を維持することです。異なるクライアントとサーバーの間で状態を共有するため、cookiesまたはsessionを使用する必要があります。サーバーは1つしかないので(理論的には)、ユーザーが1日に操作が実行されたかどうかを認識できるようにプログラムすることができます。これは、すべてあなたがサーバーとクライアント間で共有することができ、認証/セッションのいくつかの種類を持っていると仮定されます。このフラグは、注意session/cookie

を介してすべてのクライアントにまたがって共有することができます。次のようにそうでなければ、あなたはクライアント形式の異なるデバイスを開いたときに、サーバーがあなたを認識することができます/

をブラウザという方法はありませんプロセスが使用できます

  • ユーザーがクライアントAからログイン。サーバー側では(RedisやMemcacheのようなメモリ内のストア、またはDBのいずれか)、サーバーはユーザーのIDを確認して、functionTriggeredが既にtrueであるかどうかを確認します。いいえ、認証応答では、サーバがfunctionTriggered=falseフラグを送信した場合(クライアント上のクッキーを設定する)
  • クライアントAは、AJAX呼び出しを行うと、サーバは、店舗
  • ClientBからユーザがログイン中functionTriggered=trueを設定します。ログインすると、サーバはfunctionTriggered=trueがこのフラグを送信するとみなします。サーバーはこれを示すクッキーを設定します。クライアントはこれを見て、AJAXリクエストをスキップします。私はAJAX呼び出しを送信するためにOKであるかどうかを要求サーバに(別のものを維持し、ソフトウェア工学の原理を維持するために)ダスティンは、私は別の呼び出しを行うことを示唆していると述べたものに@DustinToothlessでなく、逆に同意
+0

クッキーとセッションはクライアントごとであるため、このために使用することはできません。 – Barmar

+0

@Barmarユーザーがデバイスからログインする場合を考えてみましょう。彼らの認証/セッションの詳細( 'functionTriggered')は、今サーバで利用可能になります。これは、DBまたはRedisのようなメモリストアに格納することができます。今、別のデバイスからログインすると、サーバからauthを要求し、サーバが応答するとauthの詳細と一緒に 'functionTriggered'フラグを返すことができますか? – nikjohn

+0

別のデバイスからログインすると、同じセッションには含まれないため、認証/セッションの詳細は表示されません。 – Barmar

1

かない。しかし、サーバーは、以前にリクエストを受信したかどうかに基づいて決定を行います。データベースを使用するか、最後に更新された日付を比較するファイルを使用してログを記録できます。それはすでに要求を受け取り、サーバはAJAX呼び出しを実行するためのOKを出します。

しかし、クライアントはサーバーが何を言っているかにかかわらずAJAX要求を送信する可能性があるため、上記は有効ですが、効率的ではありません。ハッカーがDoS攻撃を引き起こす可能性があるため)、1つの関数(この呼び出しも)を使用し、サーバーに電子メールを送信するかどうかを(上記の方法を使用して)決定させる必要があります。