alex_web64

Выполнение функции по окончанию ajax

    Рекомендуемые сообщения

    alex_web64    8
    alex_web64

    Здравствуйте.

    У меня есть необходимость сделать две функции, одна для загрузки определенных данных, а вторая для работы с ними. Пример:

    var response;
    
    function getSomeStuff () {
            $.get(url, function (data) {
                    response = data;
            })
    }
    
    function useResponse () {
            // работаем с переменной response
    }
    
    getSomeStuff();
    useResponse();

    Проблема в коде выше - во время запуска функции useResponse get-запрос еще не завершится, соответственно response будет undefined.

    Как заставить код выше работать, не помещая вызов функции useResponse внутрь функции success?

    Изменено пользователем alex_web64

    Поделиться сообщением


    Ссылка на сообщение
    Поделиться на других сайтах
    Igor Schnaider    162
    Igor Schnaider

    Очевидно, поместить вызов функции после получения результата.

    sorry, не внимательно прочитал вопрос :-)

    Не помещая — никак. Запрос выполняется асинхронно, основной же код в любом случае выполнится раньше, чем запрос будет обработан. Поэтому только вызывать после получения ответа.

    Изменено пользователем Igor Schnaider

    Поделиться сообщением


    Ссылка на сообщение
    Поделиться на других сайтах
    moron    14
    moron

    Для этого удобно будет использовать промисы. В jq ajax запросы через .get .post .ajax уже thenable - т.е мы можем написать так:

    $.get(url)
            .then(useResponse)
    
    function useResponse (response) {
            // работаем с переменной response
        // заметь, что она тут как первый аргумент.
    }

    Но допустим ты заложил какую-то идею в свой остальной код и мы не можем так делать. Необходимо именно две функции. В таком случае ты можешь использовать нативные промисы или jq-промисы через $.Deferred, давай попробуем:

    function getSomeStuff () {
      var q = $.Deferred();
      $.get(root + '/posts/1', q.resolve)
      return q;
    }
    
    function useResponse (response) {
            // работаем с переменной response
    }
    
    getSomeStuff().then(useResponse);

     

    Еще можно воспользоваться async-await :с Можешь поискать что-то сам по теме, потому что придется собирать оное бабелом на клиенте. В случае js на сервере можно будет пустить интерпретатор с ключем --harmony-async-await, но это скорее не твой случай. Вобщем последний абзац просто инфа для общего развития.

     

    Изменено пользователем moron
    • Like 1

    Поделиться сообщением


    Ссылка на сообщение
    Поделиться на других сайтах

    Создайте аккаунт или войдите в него для комментирования

    Вы должны быть пользователем, чтобы оставить комментарий

    Создать аккаунт

    Зарегистрируйтесь для получения аккаунта. Это просто!

    Зарегистрировать аккаунт

    Войти

    Уже зарегистрированы? Войдите здесь.

    Войти сейчас

    • Войти через Facebook
    • Войти через Twitter
    • Войти через Microsoft
    • Войти через LinkedIn
    • Войти через Google

    • Похожие публикации

      • Divnenkiy
        Автор: Divnenkiy
        Здравствуйте.
        Мучаюсь не первый день с такой проблемой.
        Есть jquery, есть модальная форма, сначала мне нужно выполнить GET запрос на сервер, и в зависимости от того, что сервер ответит решить можно ли открывать форму или нет.
        Если использоваться асинхронный запрос, то понятно, что форма откроется в любом случае. А если использовать синхронный то всё хорошо, но консоль браузера ругается, что я не правильно поступаю и мои методы Deprecated.
        Как сейчас правильно поступать в современных тенденциях?
        Для понимания что я хочу, изображу это примерно так:
        function getAccess(){
          ... запрос GET на сервер
        return ответ
        }
        function showModalWindow(){
        если getAccess() то открываем форму
        }
        Не представляю как это вырулить асинхронно
      • cyklop77
        Автор: cyklop77
        помогите пожалуйста получить ответ от ajax-запроса в angular2
        вот код сервиса:
        import { Injectable } from '@angular/core'; import { Http } from '@angular/http'; import { Observable } from 'rxjs/Observable'; @Injectable() export class RecordsService { constructor(private http: Http){ } getRecords(dateBeginUnix, dateEndUnix): Observable<any> { console.log(dateBeginUnix, dateEndUnix); let result = this.http.get('http://127.0.0.1:8000/days/' + dateBeginUnix + '/' + dateEndUnix); console.log('result', result); return result; } } вот код компонента(сокращённый):
        export class PanelComponent implements OnInit { constructor(private recordsService: RecordsService) { } private modelDateBegin: Object; private modelDateEnd: Object; private records: Object; private data: Object; displayStatistic() { this.recordsService .getRecords(this.modelDateBegin['epoc'], this.modelDateBegin['epoc']) .subscribe(data => this.records = data.json()); } } в сервис передаются 2 переменные:
        this.modelDateBegin['epoc'], this.modelDateBegin['epoc'] в них содержатся временные метки в юникс-формате. на основе этих меток бекенд выдаёт результат в виде json. проблема только в том, что в функции subscribe не происходит получение и присваивание полученного результата. соответственно я не могу результат отправить в шаблон для вывода
         
        при этом в консоли нет сообщений об ошибках. а выводится следующее:
        result Observable {_isScalar: false} ps:
        если в компоненте я заменяю строку:
        .subscribe(data => this.records = data.json()); на такую:
        .subscribe(data => this.records = data); , то в this.records следующее:
        содержится следующее:
        Response with status: 200 OK for URL: http://127.0.0.1:8000/days/1498856400/1498856400  
      • cyklop77
        Автор: cyklop77
        помогите пожалуйста решить проблему с кроссдоменным запросом. я расположил бекенд на одном сервере, а фронтэнд на другом. теперь при помощи ajax-запроса фронтэнд-скрипт не может получить данные из бекэнда
        вот адрес, по которому можно получить данные: 
        http://zlodiak.pythonanywhere.com/days/1497104260/1497968260 тут лежит мой скрипт, который отправляет ajax-запрос по вышеуказанному адресу. ajax-запрос отправляется после того как пользователь в первом датепикере выбирает дату '2017-06-01', а во втором датепикере выбирает дату '2017-06-30'. затем нажимает кнопку субмита
        в результате консоль говорит о том, что кроссдоменный запрос не разрешён:
        я пробовал располагать на одном сервере и фронтэнд, и бекэнд. при этом всё описанной проблемы не было и связка работала без проблем. но мне нужно чтобы фронтэнд и бекенд находились именно на разных серверах