等待 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
  }