1

重複の可能性:
関数からの AJAX 呼び出しからの応答を返す方法は?

Google Chrome の開発者コンソールでデバッグを試みましたが、どうしても欲しい結果が得られません。AJAX を介して外部ファイルから値を返す JavaScript 関数を作成したいと考えています。私はこのスクリプトを試しました:

var site = {
    token: function(){
        $.get('auth.php',function(data){
            return data;
        });
    }
};

...site.token()関数を呼び出すと、取得したコンテンツがauth.phpから返されます。しかし、そうではありません。いつもundefinedです。私もこれを試しました:

var site = {
    token: function(){
        var token = null;
        $.get('auth.php',function(data){
            token = data;
        });
        return token;
    }
};

しかし、それはまだ同じです。また、これを行うことで回避策を見つけます:

var token = $.get('auth.php',function(data){
    return data;
});
token.responseText;

そのコードを使用して、期待どおりの結果を得ることができます。しかし、すでに関数に入れている場合:

var site = {
    token: function(){
        var token = $.get('auth.php',function(data){
            return data;
        });
        return token.responseText;
    }
};

・・・また失敗。

*追伸: プログラミングで本当にストレスを感じているだけなのか、なぜ正しくできないのかわかりません。---」

4

3 に答える 3

2

$.post()は の省略形$.ajax()であり、どちらも非同期です (非常に悪いことをしない限り)。PHP ページへのリクエストの間、ブラウザの GUI スレッドをフリーズさせたくありません。したがってsite.token()、データを返信することはできません。

ただし、$.ajax()promise を返します ( http://www.erichynds.com/jquery/using-deferreds-in-jquery/、jquery の promise メソッドが実際にどのように機能するかを参照してください)。要するに、「仕事が終わったらまた連絡することを約束します」と書かれています。したがって、次のようにクラスを構築できます。

var site = {
    token: function(){
        var promise = $.get('auth.php',function(data){
            return data;
        });
        return promise;
    }
};

次のように呼び出します。

var promise = site.token();
promise.done(function (data) {
    alert('got the data');
    console.dir(data);
});
于 2013-01-19T18:02:16.390 に答える
1

これが可能であれば、関数のアイデアは破棄でき、構文は次のようになります。

var data = $.post("url");

ただし、AJAX は非同期であるため、これは不可能です。応答を受信するまでに時間がかかります。この場合、関数が呼び出されます。それが関数を渡すという考え方です。

を使用するためにこれを同期させる方法はありませんreturn$.ajaxwithを使用できますasync: falseが、廃止される予定です。あなたができる最善のことは、結果をreturn $.post(...)使用.done(...)して応答を使用することです。

于 2013-01-19T17:54:47.547 に答える
0

Ajax呼び出しは非同期であるため、データをフェッチする前にデータを使用します。延期されたオブジェクトの使用を検討してください。 http://api.jquery.com/category/deferred-object/

于 2013-01-19T17:59:00.563 に答える