2010-12-03 21 views
9

JavaScriptで関数を記述する必要があります。これは非同期関数を呼び出すことから状態を返します。ただし、呼び出し元は値を受け取るだけで、コールバック関数は提供されません。 ...JavaScriptで非同期関数をブロックする方法

任意のアイデアをしかし

function getState() { 
    var ret = null; 
    asyncCall("request", 
     function() { ret = "foo"; } // callback 
    ); 
    while (ret === null) 
     ; // block on the asynchronous call 
    return ret; 
} 

、ループは決して終了するつもりはありません。私のようなものを試してみましたか?ありがとうございました。

+2

最初に非同期呼び出しをブロックしたいのはなぜですか?これは意味をなさない。 – Tomalak

+1

@Tomolak:Firefoxで提供されている呼び出しであり、変更できません。たった数ミリ秒かかると予想されているので、私は他のコードをすべてリファクタリングしたくありません。 –

+0

'getState()'を呼び出す関数を投稿できますか? – Tomalak

答えて

8

http://stratifiedjs.org 残りのアプリケーションはブロックされません。 apollo jsライブラリをロードすることで、どこでも使用できます。

これは、それが成層JavaScriptで次のようになります方法です。もちろん

function getState() { 
    waitfor (var ret) { 
    // block on the asynchronous call 
    asyncCall("request", resume); 
    } 
    return ret; 
} 

ちょうどそれはこのように見えてしまいモジュール/ライブラリがあります。私は誤解していない限り http://onilabs.com/modules#http

function getState() { 
    return http.get("request"); 
} 
+0

これは外部パーサーに依存しますが、ここでは最適な解決策と思われます。 –

+0

です。しかし、壮大なスキームではそれほどオーバーヘッドはありません。 – tomg

0

理由だけではない:

asyncCall("request", function() { 
    // here you can inspect the state 
}); 

ラッパー関数のポイントは何ですか?

このように非同期関数が機能します。あなたが実行をブロックしたい場合は、同期呼び出しを使用します。

var state = syncCall("request"); 
+0

私はいくつかのプラットフォームで働いているので、ライブラリのようなものです。そして、残りのコードはこの特別な情報を待つ必要があります。同期置換は提供されません。 –

+0

@ryanliその後、残りのコードをコールバックに入れます。 –

+1

@ ime:非同期呼び出しはそれを呼び出す他のすべてのコードに感染する可能性がありますか?これらの非同期呼び出しをブロックする方法があるかどうかを知りたいだけです。 –

1

最高のあなたは、コールバック関数に呼ばれているしたいロジックを置くことであろう。なぜあなたはそれをすることができないのですか?

あなたは結果を確認するためにsetIntervalを使用することができますが、それはコールバック関数を必要とし、あまりにも...あなたがやろうとしているもの

+0

私は通常の文書JavaScriptではなく、拡張機能を書いています。関数の残りの部分はこの状態に依存し、提供されるのは非同期関数だけです。 –

1

が行うことをお勧め同期呼び出しなので、そのありませんそれは非同期のために設計された機能でそれを呼び出します。

あなたがここに答えがあります。それはそれは、同期コードのように「書き込み」ことに注意してください、あなたが書いた正確ようにあなたがあなたの非同期コードを「画策」することができます、私はあなたがStratifiedJSを探しているのだと思いHow can I get jQuery to perform a synchronous, rather than asynchronous, Ajax request?

+0

私はこれを認識していますが、XHRリクエストではありません。 –

1

は、あなたの質問、あなたはjQueryのajaxStop()イベント - http://api.jquery.com/ajaxstopを見ることができます。これは、すべてのAjax呼び出しが完了するまでブロックされます。これは、明らかに、すべての非同期呼び出しがjQueryを通じて行われることを要求します。

$(document).ajaxStop(function() { 
    // do your "ajax dependent" stuff here 
}); 
関連する問題