可能性のある複製:
AJAX関数からの呼び出しから応答を返す方法?
Jquery Ajaxを使用して、サービスを呼び出して値を更新しています。
function ChangePurpose(Vid, PurId) {
var Success = false;
$.ajax({
type: "POST",
url: "CHService.asmx/SavePurpose",
dataType: "text",
data: JSON.stringify({ Vid: Vid, PurpId: PurId }),
contentType: "application/json; charset=utf-8",
success: function (data) {
Success = true;//doesnt goes here
},
error: function (textStatus, errorThrown) {
Success = false;//doesnt goes here
}
});
//done after here
return Success;
}
およびサービス:
[WebMethod]
public string SavePurpose(int Vid, int PurpId)
{
try
{
CHData.UpdatePurpose(Vid, PurpId);
//List<IDName> abc = new List<IDName>();
//abc.Add(new IDName { Name=1, value="Success" });
return "Success";
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
サービスはAJAXから正常に呼び出されています。 値も変更されています。しかし、サービスの後、success:またはerror:関数は呼び出されていない。この場合、成功は呼び出されましたが、機能していません。
Firebugを使用して、成功またはエラー関数がスキップされ、return Success;
に直接移動することがわかりました。
コードの問題を見つけられないようです。
前もって感謝します
更新:async: false
を追加すると問題が修正されました
コードを変更します
function ChangePurpose(Vid, PurId) {
var Success = false;
$.ajax({
type: "POST",
url: "CHService.asmx/SavePurpose",
dataType: "text",
async:false,
data: JSON.stringify({ Vid: Vid, PurpId: PurId }),
contentType: "application/json; charset=utf-8",
success: function (data) {
Success = true;//doesnt goes here
},
error: function (textStatus, errorThrown) {
Success = false;//doesnt goes here
}
});
//done after here
return Success;
}
synchronous
関数からのみ値を返すことができます。それ以外の場合は、callback
を作成する必要があります。
だから私は追加しましたasync:false,
あなたのajax呼び出し
更新:
jquery ajax呼び出しはデフォルトでは非同期です。そのため、ajaxのロードが完了すると成功およびエラー関数が呼び出されます。ただし、returnステートメントは、ajax呼び出しが開始された直後に実行されます。
より良いアプローチがあります
// callbackfn is the pointer to any function that needs to be called
function ChangePurpose(Vid, PurId, callbackfn) {
var Success = false;
$.ajax({
type: "POST",
url: "CHService.asmx/SavePurpose",
dataType: "text",
data: JSON.stringify({ Vid: Vid, PurpId: PurId }),
contentType: "application/json; charset=utf-8",
success: function (data) {
callbackfn(data)
},
error: function (textStatus, errorThrown) {
callbackfn("Error getting the data")
}
});
}
function Callback(data)
{
alert(data);
}
としてajaxを呼び出します
// Callback is the callback-function that needs to be called when asynchronous call is complete
ChangePurpose(Vid, PurId, Callback);
Ajax呼び出しを関数にカプセル化して、asyncオプションをfalseに設定してください。このオプションはjQuery 1.8以降廃止されることに注意してください。
function foo() {
var myajax = $.ajax({
type: "POST",
url: "CHService.asmx/SavePurpose",
dataType: "text",
data: JSON.stringify({ Vid: Vid, PurpId: PurId }),
contentType: "application/json; charset=utf-8",
async: false, //add this
});
return myajax.responseText;
}
これもできます:
$.ajax({
type: "POST",
url: "CHService.asmx/SavePurpose",
dataType: "text",
data: JSON.stringify({ Vid: Vid, PurpId: PurId }),
contentType: "application/json; charset=utf-8",
async: false, //add this
}).done(function ( data ) {
Success = true;
}).fail(function ( data ) {
Success = false;
});
jqXHR jQuery Object の詳細を読むことができます