web-dev-qa-db-ja.com

jQueryはajaxの結果を外部変数に返します

Ajaxの使用に問題があります。

Ajaxのすべての結果を外部変数に割り当てるにはどうすればよいですか?

グーグルで調べて、このコードを見つけました。

var return_first = (function () {
    var tmp = null;
    $.ajax({
        'async': false,
        'type': "POST",
        'global': false,
        'dataType': 'html',
        'url': "ajax.php?first",
        'data': { 'request': "", 'target': arrange_url, 'method': method_target },
        'success': function (data) {
            tmp = data;
        }
    });
    return tmp;
});

しかし、私のために動作しません。

誰でもそのコードの何が悪いのかわかりますか?

30
Mohd Shahril

後にカンマがありません

'data': { 'request': "", 'target': 'arrange_url', 'method': 'method_target' }

また、return_first匿名関数の結果を保持するには、関数呼び出しを行う必要があります。

var return_first = function () {
    var tmp = null;
    $.ajax({
        'async': false,
        'type': "POST",
        'global': false,
        'dataType': 'html',
        'url': "ajax.php?first",
        'data': { 'request': "", 'target': 'arrange_url', 'method': 'method_target' },
        'success': function (data) {
            tmp = data;
        }
    });
    return tmp;
}();

注意 () 最後に。

46
Igor

これはあなたがする必要があるすべてです:

var myVariable;

$.ajax({
    'async': false,
    'type': "POST",
    'global': false,
    'dataType': 'html',
    'url': "ajax.php?first",
    'data': { 'request': "", 'target': 'arrange_url', 'method': 'method_target' },
    'success': function (data) {
        myVariable = data;
    }
});

注:「async」の使用は廃止されました。 https://xhr.spec.whatwg.org/ を参照してください。

31
joshuahealy

'async':falseを使用して非同期コードを防ぐことは悪い習慣です。

メインスレッドでの同期XMLHttpRequestは、エンドユーザーエクスペリエンスに悪影響を与えるため、非推奨です。 https://xhr.spec.whatwg.org/

表面的に非同期をfalseに設定すると、多くの問題が修正されます。なぜなら、他の答えが示すように、データを変数に入れるからです。ただし、投稿データが返されるのを待っている間(データベース呼び出し、接続の遅延などにより数秒かかる場合があります)、Javascript機能の残りの部分(トリガーイベント、Javascript処理ボタン、JQuery遷移など)アコーディオン、またはオートコンプリート(JQuery UI))は、応答が保留中の間は発生しません(サイトが実質的にフリーズされているため応答が返されない場合、これは本当に悪いことです)。

代わりにこれを試してください、

var return_first;
function callback(response) {
  return_first = response;
  //use return_first variable here
}

$.ajax({
  'type': "POST",
  'global': false,
  'dataType': 'html',
  'url': "ajax.php?first",
  'data': { 'request': "", 'target': arrange_url, 'method': method_target },
  'success': function(data){
       callback(data);
  },
});
19
Zahra Ghaed

_'async': false_は、減価償却していると言います。 ajaxの成功時にconsole.log('test1');を実行し、次にajax関数の後に通常のjsでconsole.log('test2');を実行すると、_test2_が_test1_の前に出力されるため、 ajax呼び出しにはわずかな遅延がありますが、結果を取得するために残りの関数を停止しません。変数は単に「まだ」設定されていなかったため、次の機能を遅らせる必要があります。

_function runPHP(){
    var input = document.getElementById("input1");
    var result = 'failed to run php';

    $.ajax({ url: '/test.php',
        type: 'POST',
        data: {action: 'test'},
        success: function(data) {
            result = data;
        }
    });

    setTimeout(function(){
        console.log(result);
    }, 1000);
}
_

test.phpで(この関数をテストする必要がある場合)

_function test(){
    print 'ran php';
}

if(isset($_POST['action']) && !empty($_POST['action'])) {
    $action = htmlentities($_POST['action']);
    switch($action) {
        case 'test' : test();break;
    }
}
_
0
SwiftNinjaPro