2

昨日、ある人がコメントしたトピックを投稿しました: How to use $_GET path with file_exists and keep it safe? JSONが非同期であるため、「未定義」が返されると述べています。彼は正しかったし、私はその理由を理解しようとしてきたが、私は完全に自分の深みから外れているように感じた. Deferreds を使用してこれを解決する方法、または別の解決策があるかどうかを理解できるように、誰かが何が起こっているのかを説明できるのではないかと思います。

どんな助けでも大歓迎です、乾杯!

4

3 に答える 3

1

関数を実行する$.getJSON()と、その関数は非同期であるため、その関数が終了する前に実行が続行されます。

次のコードを検討してください。

$.getJSON("/ajax/fileExists.php",{ path: path }, function (data){
    alert("THERE");
});
alert("HEY");

これは最初に「HEY」、次に「THERE」と警告します。これは、Javascript が に到達すると$.getJSON()、そのリクエストの実行を開始しますが、残りのコードを続行する前に実行が終了するのを待たないために発生します。

というわけで継続して出演alert("HEY");。その後、$.getJSONリクエストが完了すると、コールバック関数が実行され、alert("THERE");.

それが役立つことを願っています!

于 2012-10-01T14:33:42.497 に答える
0

あなたのコードは

function fileExists(path){
    $.getJSON("/ajax/fileExists.php",{ path: path },
    function (data){
        return data.path;
    });
}

ここでの問題は、内部関数がコールバックであり、return内部が Ajax リクエストの後に実行されることです。この時点で、外側の関数fileExistsは既に終了しています。リクエストを開始しただけで、終了するのを待ちません。

これを修正するには、コールバックを行うことができます

function fileExists(path, callback){
    $.getJSON("/ajax/fileExists.php",{ path: path },
    function (data){
        callback(data.path);
    });
}

このように使用してください

fileExists('/a/path', function(path){ console.log(path) } );
于 2012-10-01T14:31:41.103 に答える
0

あなたが言っているように、AJAXは非同期に動作します.ブラウザは「ロックアップ」されず、次の行に移動するまで終了するまで待機しません(他の通常のコードのように)。

基本的に、AJAX 関数を使用し、if() else()後でその結果をテストするのを待つだけで、すぐに開始されるという点で常に undefined が返されます。AJAX が実際に完了するまで待ちません。

したがって、この場合、コールバック関数/遅延オブジェクトを使用する必要があるのはなぜですか! (AJAXから返された結果を操作しようとしているため)

于 2012-10-01T14:32:05.860 に答える