0

Railsアプリの1つの場所では、外部サーバーから多数の応答を読み込む必要があります。これは現在、次のようになっています。

  1. ユーザーがサーバーにAJAXリクエストを行います。「データを読み込んでいます...」が表示されます。
  2. 5〜30秒後、railsアプリは応答を送信します(データがキャッシュされていないと仮定します)。

その長い待機期間中に、リクエストの進行状況を通知するメッセージでユーザーに通知し続けることができれば、はるかに良いでしょう。そのような:

  1. ユーザーがリクエストを行います(以前と同様)。
  2. 「ABCを取得しています」というメッセージが表示されます
  3. 「XYZを取得しています」というメッセージが表示されます
  4. 「データを処理しています」というメッセージが表示されます
  5. 通常通りフルレスポンス。

どうすればこれを行うことができますか?1つのリクエストに複数のJavaScript応答を送り返すことは不可能だと思いますが、これを行う正しい方法がわかりません。

4

1 に答える 1

3

これは注意が必要ですが、Railsはリクエストのストリーミングの概念をサポートしています。しかし、これを機能させるには、おそらくプロジェクトで多くの作業を行う必要があります。

Tenderlove(Aaron Patterson)は、Railsでストリーミングがどのように機能するかについてのイントロを投稿しました。このトピックにはRailscastがあると思います。

おそらく、より簡単な解決策は、これを複数のリクエストに分割することです。したがって、メインのリクエスト(ajaxリクエストであると仮定)は、完了するまでに永遠にかかります。一方、別のajaxリクエストのステータスをポーリングすると、メインアクションがそのプロセスでデータベースを更新するため、他のリクエストがそのステータスを取得して適切な応答を返すことができます(プロセスの現在のメインリクエストはどこにありますか)。

したがって、各リクエストにリクエストIDのようなものを割り当ててから、それらのリクエストとそのステータスのデータベーステーブルを作成します(id:integerとstatus:stringのみを使用するのと同じくらい簡単です)。

クライアントでリクエストIDを割り当て(ランダムデータを使用してハッシュなどを作成します)、そのIDで長いリクエストを開始します。次に、クライアントは同じIDを持つ別のエンドポイントをポーリングして、ステータスを元に戻します。

その間、長時間実行されるリクエストは、ステータステーブルを、指定されたIDと、現在そのリクエストを処理している場所で更新します。

于 2012-11-20T12:22:12.467 に答える