0

これが意図したとおりに機能しないかどうかはわかりませんが、私が混乱しているだけです。

私がやりたいのは、非同期にアクションを遅らせることであり、await(int millis)友達になれそうです。

何が起こるかは次のとおりです。

1. Application.indexに POST を送信するフォームを表示しますApplication.something

アプリ/コントローラー/Application.java

public static void index() {
    render();
}

アプリ/ビュー/アプリケーション/index.html

#{form @Application.something()}
    <input type="submit">
#{/form}

2. Application.somethingはその処理を実行し、チェーンを に戻しindexます。

アプリ/コントローラー/Application.java

public static void something() {
    await(500);

    // Here be business

    index();
}

3. Play でアプリケーション エラーが発生します: 「テンプレート Application/something.html が存在しません」

したがって、での実行が一時停止/再開された後にrender()が呼び出されると、 のテンプレートをレンダリングしようとしますが、もちろん存在しません。Application.indexApplication.somethingApplication.something

すべてを削除するとawait(500)、問題なく動作します (302 が発行indexされ、期待どおりにレンダリングされます)。

私はリダイレクトを強制することができます

redirect("/");

私が望む結果を得ることができますが、これは醜いです。

設定もできます

request.action = "Application.index";

の直後に手動でawaitレンダリングし、意図したとおりに機能しApplication.indexます(実際には魔法が機能します)。Controller.template()


await基本的に、すべて問題なく、メソッド呼び出しではなく文字列を使用することを余儀なくされていますか、それとも少しずれていますか?

乾杯、トバイアス。

4

1 に答える 1

0

await() メソッドを呼び出すと、Play はこの HTTP リクエストを中断します。タイムアウト後、再度呼び出されたかのように、新しい HTTPRequest として再開されます。

最初のケースでは、await() メソッドがなくても、リダイレクトは正しく行われます。これは、このメソッド呼び出しが Play フレームワークによって正しくインターセプトされ、Router の逆ルート生成が 302 リダイレクトの発行に必要な URL を作成するためです。(詳細は ActionChaining のドキュメントを参照)

しかし、2 番目のケースでは、await() メソッドの後に新しい HTTPRequest が作成され、アクション チェーンは発生しません。つまり、フレームワークは index() メソッドの呼び出しをインターセプトしていません。これは他のメソッドと同様に実行されるため、リダイレクトは表示されません。

于 2011-09-12T17:34:57.027 に答える