这是一个包含在方法中的简单ajax调用。
MyNS.GetStringList = function (successCallback, failedCallback) {
var methodUrl = serverUrl + "/GetStringList";
$.ajax({
type: "GET",
contentType: "application/json; charset=utf-8",
dataType: "json",
url: methodUrl, // Location of the service
data: {}, //Data sent to server
beforeSend: function (XMLHttpRequest) {
//ensures the results will be returned as JSON.
XMLHttpRequest.setRequestHeader("Accept", "application/json");
},
success: successCallback,
error: failedCallback
});
}
这是调用上述方法的方法。
function GoGetTheStringList() {
var stringList;
stringList = MyNS.GetStringList(function (data) { return data.d; }, function (XmlHttpRequest, textStatus, errorThrown) {
alert("error");
});
alert(reasonsDictionary); // THIS IS UNDEFINED!
}
使第一个方法返回data.d对象的正确语法是什么?
一如既往地谢谢! 乔恩
答案 0 :(得分:6)
它不能真的。 Ajax调用是异步的,这意味着该方法将在调用success
回调之前返回。
编辑/更正:您可以这样做,但您必须将jQuery ajax async
选项设置为false
,这意味着您将执行同步调用,这意味着您的整个应用程序将等待它返回。最好是在调用success
时将调用传递给函数进行调用。
响应您的修改:是的,它将是未定义的,因为它已脱离上下文。你需要做的是从回调内部处理你的数据,因为那时你会知道你拥有它,并且因为你不能从函数B中返回数据A.在你的回调中你应该调用一个处理你得到的数据的功能。
var latestData;
function getStuff(succeeded,failed) {...}
function gotStuff(dataWrapper) {
latestData = dataWrapper.d;
doThingsWithStuffData(dataWrapper.d);
}
getStuff(gotStuff, function () { ... });
答案 1 :(得分:0)
您可以使用jQuery deffered,因为它更适合此目的。
MyNS.GetStringList = function () {
var methodUrl = serverUrl + "/GetStringList";
return $.ajax({ // return here, this will returns a deffered object
type: "GET",
contentType: "application/json; charset=utf-8",
dataType: "json",
url: methodUrl, // Location of the service
data: {} //Data sent to server
});
}
您不应该这样做
beforeSend: function (XMLHttpRequest) {
//ensures the results will be returned as JSON.
XMLHttpRequest.setRequestHeader("Accept", "application/json");
},
这就是dataType: 'json'
所做的,它为jQuery提供了关于服务器响应中的预期的提示。
然后在你的函数中
function GoGetTheStringList() {
var stringList;
$.when( MyNS.GetStringList() )
.done(function( data ){ console.log( data.d ); });
.fail(function( data ) { console.log('Request failed'); });
}