jQuery Ajax with async: false 并返回数据
jQuery Ajax with async: false and return data
我正在构建一个基于浏览器的应用程序。在window.load上,我调用了一个jquery AJAX GET函数,它应该从服务器获取一些游戏数据。一旦数据在那里,我就会将这些数据解析到我的JavaScript中并构建一些东西。出于这个原因,我将异步设置为 false。
现在看看这个函数,我想在 ajax.success 上调用另一个函数,但我想使用新返回的数据以及发送到这个函数的数据作为参数(来自另一个异步 ajax 调用)。我该怎么做?谢谢
window.onload = function(){
ajax.getFleets();
ajax.getShips(fleets);
manager.draw() // can only draw if both ajax functions have received data !)
}
getShips: function(fleets){
$.ajax({
type: "GET",
url: "getGameData.php",
datatype: "json",
data: {
type: "ships"
},
error: ajax.error,
success: ajax.mergeData, //want to pass fleets and returnData to this function
async: false
});
},
另外,一般来说,使用 async: false 是正确的方法,对吧?
谢谢
$.ajax
将向回调函数传递 AJAX 请求的结果,因此您可以使用简单的匿名函数来获取这两个部分。假设你已经定义了如下的回调函数:
ajax = {};
ajax.mergeData = function(fleets, ajaxResult) {
console.log(fleets);
console.log(ajaxResult);
};
您可以将回调函数定义为:
function(result) { ajax.mergeData(fleets, result); }
综上所述,您的getShips函数将如下所示:
ajax.getShips = function(fleets) {
$.ajax({
type: "GET",
url: "getGameData.php",
datatype: "json",
data: {
type: "ships"
},
error: ajax.error,
success: function(result) { ajax.mergeData(fleets, result); }
});
};
回答您的第二个问题:async: false
是一个已弃用的选项,因此您不能依赖它来工作。它还会锁定浏览器,直到服务器响应,这会导致非常糟糕的用户体验。最好使用回调函数或承诺在 AJAX 请求完成时执行操作。以下是可能有用的承诺概念的简短摘要。
这就留下了最后一个大问题:我们如何将这些调用链接在一起,以便getShips()
依赖于getFleets()
的结果,而manager.draw()
依赖于两者?只需两次调用,您就可以仅使用回调; getShips
' 成功回调调用getFleets
,getFleets
' 回调调用manager.draw
。这是让 A → B → C 依赖链工作的最简单方法——但我们也可以使用 jQuery 的承诺,这可能会使我们的代码更容易理解。
首先,我们更改getFleets
以返回调用$.ajax
的结果:
ajax = {};
ajax.getFleets = function() {
return $.ajax({ /* Details elided here */ });
}
接下来,让我们更新getShips
以对该数据发出 AJAX 请求,并返回返回组合数据的承诺:
ajax.getShips = function(fleets) {
return $.ajax({ /* Details elided again */ })
.done(function(ajaxResult) { return mergeData(fleets, ajaxResult); });
};
这有点棘手; $.ajax
返回一个承诺,该承诺最终将解析为我们的船舶数据。当它发生时,我们将在.done
中调用返回合并数据的函数。而且该.done
也返回一个承诺 - 因此getShips
现在返回一个最终将返回合并数据的承诺。
所以现在我们可以编写我们的 window.onload
函数来将所有这些链接在一起,并且仅在所有数据可用时才调用manager.draw
:
window.onload = function() {
ajax.getFleets()
.done(ajax.getShips)
.done(manager.draw);
}
- AJAX调用并在Node中获取返回数据
- 角度服务未返回数据
- 统计ajax返回数据中的html元素
- 有没有更好的方法可以测量从Ajax调用返回数据所需的总时间
- Imgur API图像搜索未返回数据
- javascript对象显示为null,但object.properties返回数据
- 如何从ajax调用JQuery返回数据
- 试图从嵌套的回调函数返回数据
- NodeJS FS 不从多个文件返回数据
- ajax函数未在C#中返回数据
- 如何在公共js模块中从web服务返回数据
- 将字符串与 JSON 对象组合以返回数据
- 嵌套异步函数未及时返回数据的问题
- NodeJS JSONStream 以一个长字符串的形式返回数据
- 如何使用 HTML 图像请求将数据发送到服务器,或返回数据作为响应
- 从 Angular 模态服务中的模态主体模板返回数据
- jQuery 每个循环返回数据两次
- $.getJSON 在返回数据后不会运行函数
- 如何访问返回数据中的特定json值
- 工厂返回数据后未设置角度$scope