0

この種の質問がかなり頻繁に出てくることは知っていますが、JavaScript の待機のようなメカニズムについて助けが必要です。setTimeout ベースのソリューションが登場することはわかっていますが、私の場合、それを実現する方法がわかりません。

内部で WebSocket を使用する API を作成しています。WebSocket をセットアップする connect() メソッドがあり、WebSocket がセットアップされるまで戻らないようにする必要があります。接続が成功したかどうかの値を返すようにしたいのですが、それは主な問題ではありません。

私が直面している問題は、ユーザーが connect() を呼び出した後、適切に設定されている WebSocket に依存する別のメソッドを呼び出す可能性があることです。呼び出しが早すぎると、オブジェクトが使用できないことを示すエラーがスローされます。

私の現在の解決策は、接続が成功したと判断したときに「接続済み」フラグを設定し、各メソッドでそれをチェックすることです。接続されていない場合は、フラグを設定する同じコードによって実行されるキューにメソッド呼び出しを追加します。これは機能しますが、メソッド全体にそのスタイルのコードが導入され、これらの関数の呼び出しが延期されるため、ユーザーの観点から誤解を招くようにも見えます。また、これらの呼び出しが到達する前に完了することに依存する他のユーザー コードがある場合、期待どおりに動作しません。

この事件をどう処理するか頭を悩ませている。最も簡単な解決策は、WebSocket がセットアップされるまで接続からの戻りをブロックする方法を見つけることですが、それは実際には JavaScript の方法ではありません。もう 1 つのオプションは、コールバックで残りのコードを提供するようにすることでしたが、この場合は奇妙なことのように思えます。たぶん私はそれを考えすぎていますか?

編集:私の問題をよりよく説明するために、ユーザーができることの例を次に示します。

var client = new Client(options);
client.connect();
client.getServerStatus();

getServerStatus() メソッドは WebSocket を内部的に使用します。WebSocket がまだ設定されていない場合、ユーザーは使用できないというエラーを受け取ります。

4

3 に答える 3

2

今日の Javascript は、残念ながらそのようには機能しません。将来 (ECMA6)、この問題をより直接的に解決する新しい言語機能が追加される可能性があります。ただし、現時点では、現在受け入れられている非同期イベントの処理方法に固執しており、これはコールバックに限定されています。「コールバック地獄」を処理するために「約束」を調べたいと思うかもしれませんが、これにはライブラリが必要です。

確かに、どこにでもコールバックがあるのは、特に Web プログラミングの初心者にとっては奇妙に思えますが、この段階ではこれが唯一の方法です (クロスブラウザー フレンドリーなソリューションが必要であると仮定して)。

于 2013-09-23T20:35:11.227 に答える
0

「待つ」はほぼあなたが探しているキーワードです。実際、これyieldを行うのはそれです。たとえば、MDN のドキュメントを参照してください。

于 2013-09-23T20:37:01.687 に答える