在Javascript中等待异步GET请求

在Javascript中等待异步GET请求,javascript,api,asynchronous,callback,Javascript,Api,Asynchronous,Callback,我想向API发出GET请求并从中检索数据。据我所知,我的$.getJSON是异步的,这意味着它不会等到完成后才继续使用我的代码。现在,我认为从研究中可以看出最好的方法是使用回调,但我仍然不知道如何最好地实现它(即使是最好的方法)。您可以使用下面的示例代码来演示吗 function getData(URL) { $.getJSON(URL, function(data) { //play with data, such as save to localStorage on

我想向API发出GET请求并从中检索数据。据我所知,我的
$.getJSON
是异步的,这意味着它不会等到完成后才继续使用我的代码。现在,我认为从研究中可以看出最好的方法是使用回调,但我仍然不知道如何最好地实现它(即使是最好的方法)。您可以使用下面的示例代码来演示吗

function getData(URL) {
    $.getJSON(URL, function(data) {
        //play with data, such as save to localStorage on web broswer
    }
}

function container() {
    var URL = "https://someurl....";
    getData(URL);

    // Now access the data from localStorage, which was saved during .getJSON function, will fail if getData is ran async due to delay
    // Open URL here appending data from the GET request, have to obviously have it prior to proceeding
}

我知道这是一个相当广泛的讨论,我向你保证,我没有张贴这之前,研究,但我仍然有一个困难的时间。如果有人能用这个例子来演示,它可能真的能帮助我理解。谢谢大家!

您可以让
getData
使用回调函数:

function getData(URL, cb) {
    $.getJSON(URL, function(data) {
        //play with data, such as save to localStorage on web broswer
        cb(data);
    }
}

function container() {
    var URL = "https://someurl....";
    getData(URL, function(data) {
      // Now access the data from localStorage          
    });
}
或者返回一个承诺,然后允许您使用async/await

function getData(URL) {
  return new Promise(function(resolve, reject) {
    $.getJSON(URL, function(data) {
        //play with data, such as save to localStorage on web broswer
        resolve(data);
    }
  });
}

async function container() {
    var URL = "https://someurl....";
    var data = await getData(URL);
    // Now access the data from localStorage          
}
既然
$.getJSON
已经返回了一个承诺,这就更好了:

function getData(URL) {
    return $.getJSON(URL).then(function(data) {
        //play with data, such as save to localStorage on web broswer
        return data;
    });
}

// container function stays the same as above
或:


看来问题已经有了答案。实际上,在回调函数中执行所有“播放”操作;你读过什么,学过什么,你到底还不明白什么?正如您所说,这是一个相当广泛的讨论,因此,除非您非常具体,否则很难看到再次尝试解释如何成功。虽然链接的问题确实提供了有用的信息,但它不仅需要将所有.getJSON语句转换为.ajax符号和格式,但随后还需要将asnyc请求后应运行的所有后续代码移动到新函数中,然后将其作为回调传递到原始函数中……这需要大量重构,我希望会有更具可读性/说服力的内容。另外,对于ajax请求,它会使回调在成功后运行,但是如果我希望所有代码等待请求完成,该怎么办呢。不,它不是,您可以使用与
$.getJSON
或任何其他异步函数/方法相同的逻辑。这就是标准副本的要点。2.您必须提取一个函数用于回调,无论是直接回调还是承诺/可观察回调,或者您可以使用
async
/
await
语法,该语法也包含在副本中。
return new Promise
是多余的
getJSON
已返回一个可编辑对象。
async function getData(URL) {
    var data = await $.getJSON(URL);
    //play with data, such as save to localStorage on web broswer
    return data;
}

// container function stays the same as above