1

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

function Run(someJsonObject) {
    $.ajax({
        type: "post",
        contentType: "application/json; charset=utf-8",
        url: "/MyWebService",
        data: JSON.stringify(someJsonObject),
        dataType: "json",
        success: function (data) {
            var parsedJson = jQuery.parseJSON(data.d);
            // Do some magic...

            return true; // success!
        },
        error: function (jqXHR, textStatus, errorThrown) {
            return false;
        }
    });

}

var result = Run({dummy:'dummy'});

私が間違っていなければ、上記の関数はtrueまたはfalseを返しませんが、未定義になります。AJAX呼び出しの結果を返したいので、同期させたいと思います(AJAXを使用していることに気づきました)。どうすればこれを達成できますか?

4

4 に答える 4

2

あなたは後ろ向きです、あなたのajaxを最初に走らせてください。

$(function () {
    $.ajax({
        type: "post",
        contentType: "application/json; charset=utf-8",
        url: "/MyWebService",
        data: JSON.stringify(someJsonObject),
        dataType: "json",
        success: function (data) {
            var parsedJson = jQuery.parseJSON(data.d);
            // Do some magic...
            DoStuffWithResult(data.d);
            return true; // success!
        },
        error: function (jqXHR, textStatus, errorThrown) {
            return false;
        }
    });
});

function DoStuffWithResult(result){
    //time to rock, i have my result
}
于 2013-01-25T23:02:41.880 に答える
1

asyncjquery呼び出しにオプションを追加すると、非同期ではなくなります。

そうは言っても、これは通常悪い考えであり、おそらくより良い方法で処理することができます。通常、これは、最初にajax呼び出しを実行し、成功関数でデータを操作することによって行われます。

しかし、あなたがこのようにそれをすることに本当に固執しているなら、これはあなたが望むものです:

function Run(someJsonObject) {
     var result;
     $.ajax({
        async: false,
        type: "post",
        contentType: "application/json; charset=utf-8",
        url: "/MyWebService",
        data: JSON.stringify(someJsonObject),
        dataType: "json",
        success: function (data) {
            var parsedJson = jQuery.parseJSON(data.d);
            // Do some magic...

            result = true; // success!
        },
        error: function (jqXHR, textStatus, errorThrown) {
            result = false;
        }
    });
    return result;
}

var result = Run({dummy:'dummy'});
于 2013-01-25T23:06:59.703 に答える
0

あなたは単純化することができます

$.post('/MyWebService', JSON.stringify(someJsonObject), function(r) {
   if(r.success) {
       // do something (1)
   } else {
       // do else something (2)
   } 
},'json').error(function() { 
   alert('comunication error');
 });

このような応答があった場合

{ "success": true, data: "my_data" }

何かを実行する(1)その他(2)

有効なjsonまたはタイムアウトトリガーではない場合.error()

于 2013-01-25T23:14:49.920 に答える
0

jquery同期でajaxリクエストを作成し、それを次の戻り値にする場合Run

function Run(someJsonObject) {
    var returnValue;
    $.ajax({
        type: "post",
        async: false,
        contentType: "application/json; charset=utf-8",
        url: "/MyWebService",
        data: JSON.stringify(someJsonObject),
        dataType: "json",
        success: function (data) {
            var parsedJson = jQuery.parseJSON(data.d);
            // Do some magic...

            returnValue = true; // success!
        },
        error: function (jqXHR, textStatus, errorThrown) {
            returnValue = false;
        }
    });
    return returnValue;

}

ajaxオプションに追加async: falseし、戻り値としてローカル変数(成功ハンドラーとエラーハンドラーにアクセス可能)を使用しました。

$.ajax(/* snip */)単にpromiseオブジェクトを返すため、戻ることはできません。

于 2013-01-25T23:10:53.210 に答える