Ожидание асинхронного запроса GET в Javascript

Я хочу сделать запрос GET к API и получить от него данные. Насколько я знаю, мой $.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
}

Я знаю, что это довольно широко обсуждается, и уверяю вас, что не публиковал это до исследования, но мне все еще тяжело. Если бы кто-то мог продемонстрировать этот пример, это могло бы действительно помочь мне понять. Спасибо!

Похоже, ответ уже есть в вопросе. Как бы то ни было, сделайте всю «игру» в функции обратного вызова.

Teemu 13.02.2019 09:29

Вместо обеспечение вы могли бы использовать продемонстрировать; что вы прочитали, что узнали и что именно вы еще не понимаете? Как вы говорите, это довольно широко обсуждается, поэтому трудно понять, как еще одна попытка объяснить будет успешной, если вы не сможете быть предельно конкретными.

jonrsharpe 13.02.2019 09:33

Хотя связанный вопрос действительно предоставляет полезную информацию, для этого потребуется не только преобразовать все операторы .getJSON в нотацию и формат .ajax, но также потребуется перенести весь последующий код, который должен выполняться после запроса asnyc, в новую функцию, которая затем следует передать в исходную функцию в качестве обратного вызова ... это много рефакторинга, и я надеялся, что будет что-то более читаемое/красноречивое. Кроме того, с запросом ajax это сделает так, чтобы обратный вызов выполнялся в случае успеха, но что, если я хочу, чтобы ВЕСЬ код ждал, пока запрос не будет завершен?

Birdman 13.02.2019 09:49

1. Нет, вы можете использовать ту же логику с $.getJSON или любая другая асинхронная функция/метод. В этом суть канонических дубликатов. 2. Вам нужно будет извлечь функцию для использования с обратными вызовами, будь то напрямую или с промисами/наблюдаемыми объектами, или вы можете использовать синтаксис async/await, который также описан в дубликате.

jonrsharpe 13.02.2019 12:53
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
4
51
1

Ответы 1

Вы можете использовать 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

Или:

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
return new Promise является избыточным. getJSON уже возвращает пригодный для использования объект.
Quentin 13.02.2019 16:12

Другие вопросы по теме