等待 Ajax 调用函数结束,然后 return 对象到外部变量
Wait for Ajax call in function to end, THEN return object to an outside variable
我想按预期使用 JavaScript 异步。我想将收到的 data/objects 分配给我需要的尽可能多的变量(DataModel01、DataModel02、DataModel03 等等)。这个想法是我对 API 数据的需求一直在变化,我只想定义一次从哪里获取数据(API 端点),以及在哪个本地 variable/object存储它。
按照我的方式,它 return 是从 fetchDataJSON() 函数接收到数据的对象。但是,如何让 return 等待 Ajax 完成?我已经尝试了几种方法,包括计时器和回调,但根本不起作用。
我看到了其他关于ajax和async的问题,一般都是建议使用回调。所以我相信我可能会偏离轨道,但我需要帮助找出一种优雅地处理这个问题的方法。我真的需要像这样乱用计时器和丑陋的解决方案吗?
function fetchDataJSON(endpointUrl) {
var returnObj = [];
// Ajax call
$.ajax({
type: "GET",
url: endpointUrl,
dataType: 'json',
async: true,
success: updateData,
error: handleError
});
function updateData(data) {
returnObj = data;
}
function handleError(XHR, message, error) {
console.log("Failed XHR");
}
return returnObj; // Return JSON object
}
var DataModel01 = fetchDataJSON( "http://mydata.com/endpoint/sweetjson" );
var DataModel02 = fetchDataJSON( "http://mydata.com/endpoint/somethingelse" );
编辑:
我现在找到了一个可行的解决方案,yihar。我已将 Karman 的答案标记为已接受,因为它是最接近解决方案的答案。我最终的解决方案,也是受一位同事的启发,如下:
var DataModel01 = [];
var DataModel02 = [];
function fetchDataJSON(endpointUrl, callbackWhenDone) {
// Ajax call
$.ajax({
type: "GET",
url: endpointUrl,
dataType: 'json',
async: true,
success: updateData,
error: handleError
});
function updateData(data) {
callbackWhenDone(data);
}
function handleError(XHR, message, error) {
console.log("Failed XHR");
}
}
fetchDataJSON(
"http://mydata.com/endpoint/sweetjson",
function(newData) { DataModel01 = newData; }
);
fetchDataJSON(
"http://mydata.com/endpoint/somethingelse",
function(newData) { DataModel02 = newData; }
);
在代码的第一行声明 var DataModel1。
在成功方法(updateData)中直接将数据赋值给DataModel1。在成功方法本身中,您可以使用 url 区分 datamodel2
function fetchDataJSON(endpointUrl, callback) {
function updateData(data) {
returnObj = data;
callback(returnObj)
}
fetchDataJSON( "http://mydata.com/endpoint/sweetjson", getJson );
enter code here
function getJson(returnObj)
{
//do work with returnObj
}
我想按预期使用 JavaScript 异步。我想将收到的 data/objects 分配给我需要的尽可能多的变量(DataModel01、DataModel02、DataModel03 等等)。这个想法是我对 API 数据的需求一直在变化,我只想定义一次从哪里获取数据(API 端点),以及在哪个本地 variable/object存储它。
按照我的方式,它 return 是从 fetchDataJSON() 函数接收到数据的对象。但是,如何让 return 等待 Ajax 完成?我已经尝试了几种方法,包括计时器和回调,但根本不起作用。
我看到了其他关于ajax和async的问题,一般都是建议使用回调。所以我相信我可能会偏离轨道,但我需要帮助找出一种优雅地处理这个问题的方法。我真的需要像这样乱用计时器和丑陋的解决方案吗?
function fetchDataJSON(endpointUrl) {
var returnObj = [];
// Ajax call
$.ajax({
type: "GET",
url: endpointUrl,
dataType: 'json',
async: true,
success: updateData,
error: handleError
});
function updateData(data) {
returnObj = data;
}
function handleError(XHR, message, error) {
console.log("Failed XHR");
}
return returnObj; // Return JSON object
}
var DataModel01 = fetchDataJSON( "http://mydata.com/endpoint/sweetjson" );
var DataModel02 = fetchDataJSON( "http://mydata.com/endpoint/somethingelse" );
编辑: 我现在找到了一个可行的解决方案,yihar。我已将 Karman 的答案标记为已接受,因为它是最接近解决方案的答案。我最终的解决方案,也是受一位同事的启发,如下:
var DataModel01 = [];
var DataModel02 = [];
function fetchDataJSON(endpointUrl, callbackWhenDone) {
// Ajax call
$.ajax({
type: "GET",
url: endpointUrl,
dataType: 'json',
async: true,
success: updateData,
error: handleError
});
function updateData(data) {
callbackWhenDone(data);
}
function handleError(XHR, message, error) {
console.log("Failed XHR");
}
}
fetchDataJSON(
"http://mydata.com/endpoint/sweetjson",
function(newData) { DataModel01 = newData; }
);
fetchDataJSON(
"http://mydata.com/endpoint/somethingelse",
function(newData) { DataModel02 = newData; }
);
在代码的第一行声明 var DataModel1。
在成功方法(updateData)中直接将数据赋值给DataModel1。在成功方法本身中,您可以使用 url 区分 datamodel2
function fetchDataJSON(endpointUrl, callback) {
function updateData(data) {
returnObj = data;
callback(returnObj)
}
fetchDataJSON( "http://mydata.com/endpoint/sweetjson", getJson );
enter code here
function getJson(returnObj)
{
//do work with returnObj
}