質問: data.issues; } }); // jsonissues accessible here -- good!! _私の回答に対するフォローアップのコメントをいくつか(そしてそれらすべてに感謝します)。これを行うための私の目的は、最初にjsonオブジェクトに、ユーザーが削除および保存できる問題のリストを読み込むことです。しかし、これはページ上の後続のインタラクションを介して行われ、ユーザーがjsonオブジェクトで何をしたいのかは予測できませんwithinコールバック。したがって、コールバックが完了したらアクセス可能にする必要があります。ここで私のロジックに欠陥がありますか?真剣に、私が見ていない何かがあるかもしれないので...また、私は.ajax()jqueryドキュメントを読んでいて、asyncをfalseに設定すると、「データを同期的にロードします。リクエストがアクティブな間、ブラウザをブロックします。 」これが進行中に、ユーザーの操作をどのようにブロックする必要があるのか、誰にも分かりますか?なぜそんなに心配なのですか?すべての回答に感謝します。
回答: コールバック関数を提供するとき、そのポイントは、そのコールバックの実行を後で延期し、すぐに次のものの実行を継続することです。これは、ブラウザー内のjavascriptのシングルスレッド実行モデルのために必要です。強制的に同期実行することは可能ですが、操作の全期間にわたってブラウザがハングします。 $ .getjsonのようなものの場合、ブラウザが応答を停止するのは非常に長い時間です。つまり、この手続き型のパラダイムを使用する方法を見つけようとしているということです。var foo = {}; $.getjson("url", function(data) { foo = data.property; }); // use foo here. コードを次のようにリファクタリングする必要がある場合:$.getjson("url", function(data) { // do something with data.property here. }); コールバック関数をシンプルに保ちたい場合、「何かをする」は別の関数の呼び出しである可能性があります。重要な部分は、コードを実行する前に$ .getjsonが終了するまで待っていることです。カスタムイベントを使用して、$。getjsonの後に配置したコードがissuesreceivedイベントをサブスクライブし、$。getjsonコールバックでそのイベントを発生させることもできます。$(document).ready(function() { $(document).bind('issuesreceived', issuesreceived) $.getjson("url", function(data) { $(document).trigger('issuesreceived', data); }); }); function issuesreceived(evt, data) { // do something with data here. } 更新:または、データをグローバルに保存し、カスタムイベントを使用して、データが受信され、グローバル変数が更新されたことを通知することもできます。$(document).ready(function() { $(document).bind('issuesreceived', issuesreceived) $.getjson("url", function(data) { // i prefer the window.data syntax so that it's obvious // that the variable is global. window.data = data; $(document).trigger('issuesreceived'); }); }); function issuesreceived(evt) { // do something with window.data here. // (e.g. create the drag 'n drop interface) } // wired up as the "drop" callback handler on // your drag 'n drop ui. function ondrop(evt) { // modify window.data accordingly. } // maybe wired up as the click handler for a // "save changes" button. function savechanges() { $.post("saveurl", window.data); } 更新2:これに応えて: これが進行中に、ユーザーの操作をどのようにブロックする必要があるのか、誰にも分かりますか?なぜそんなに心配なのですか?すべての回答に感謝します。 同期ajax呼び出しでブラウザをブロックしないようにする必要がある理由は、ブロックされたjavascriptスレッドがブラウザ内の他のすべてもブロックするためですタブや他のウィンドウです。つまり、スクロール、ナビゲーション、何もありません。すべての意図と目的において、ブラウザがクラッシュしたように見えます。ご想像のとおり、このように動作するページは重要ユーザーへの迷惑。