我有两个函数,第一个是CreateNumberList(),我在其中调用函数GetNumbersFromServer(),结果我想创建一个在页面中使用的列表。第二个是带有ajax()的GetNumbersFromServer(),它调用Webservice并返回数字。 请参阅以下代码:
<script>
function CreateNumberList() {
$.when(GetNumbersFromServer()).then(function(result) {
//Do something with result
});
}
function GetNumbersFromServer() {
$.ajax({
url: getWebServiceUrl() + "GetNumbersFromServer",
type: "POST",
dataType: "xml",
cache: false,
data: {}
}).done(function (data, status) {
return data;
}).error(function (jqXHR, textStatus, errorThrown) {
console.log("GetNumbersFromServer: " + textStatus + " - " + errorThrown);
});
}
</script>
问题是,CreateNumberList()函数不等待ajax()函数的结果。我知道ajax()是异步的,调用函数不等待ajax()。出于这个原因,我找到了$ .when()。then()函数。 jQuery API中的示例在when()函数中直接调用ajax()。
$.when( $.ajax( "/page1.php" ), $.ajax( "/page2.php" ) )
.then( myFunc, myFailure );
但我想在.when()函数中调用我的函数,然后在.then()函数中使用它的结果而不是.when()函数中的ajax()直接用于维护,复杂性和凝聚力的原因。
我对此感到困惑,无法找到任何解决方案。我没有运气搜索了好几个小时。我也不确定“return”是否是从函数返回值的正确方法,如果我必须首先创建一个延迟对象来回调/返回结果。
非常感谢任何帮助,谢谢!
答案 0 :(得分:1)
您必须始终从异步函数返回一些内容。
function GetNumbersFromServer() {
// here
return $.ajax({
url: getWebServiceUrl() + "GetNumbersFromServer",
type: "POST",
dataType: "xml",
cache: false,
data: {}
}).fail(function (jqXHR, textStatus, errorThrown) {
console.log("GetNumbersFromServer: " + textStatus + " - " + errorThrown);
});
}
function CreateNumberList() {
// here, too
return GetNumbersFromServer().then(function(result) {
// do something with result
// and here
return data;
});
}
请注意,没有必要$.when()
,GetNumbersFromServer()
的返回值是一个功能齐全的承诺。
通过不间断的回报链,您可以创建一个完整的工作者功能链:
CreateNumberList().then(function (data) {
// do something with data
return newData;
}).then(function (newData) {
// do something with newData
// and so on
});