Как правильно вернуть мои данные из вызова AJAX (AngularJS)

У меня есть представление, которое вызывает эту функцию ниже, которая делает вызов AJAX к нашему API - это по какой-то причине всегда возвращает «неопределенное», когда я просматриваю это в AngularScope с помощью инструмента проверки Firefox DOM.

Если я проверю вкладку «Сеть», я увижу, что этот URL-адрес был вызван, и увижу JSON, который я ожидаю, затем я хочу вернуть данные JSON data.words, но это всегда возвращает undefined? Если я удалю вызов AJAX и просто оставлю последний возврат с помощью «статических» и «слов», это работает, как и ожидалось, поэтому мне ясно, что что-то о возврате в успешном вызове AJAX кажется неправильным ... Любые идеи??

// в сервисном файле AngularJS

this.getAccSignoffWords = function() {
    var url = ApiService.getDomain() + 'account/signoff';
    $http({
        method : 'GET',
        url : url
    }).success(function(data) {
        if (data.success) {
            return data.words; // I want to return this JSON to the scope
        }
    }).error(function(data) {
        throw "Failed to get sign-off words";
    })['finally'](function(data) {

    });

    // return [ 'static', 'words' ]; // this line is commented out and only used for testing and is an example of the type of data expected from data.words
}

person Zabs    schedule 22.09.2016    source источник
comment
Попробуйте выполнить синтаксический анализ данных обратного вызова: data= JSON.parse(data)   -  person Nishanth Matha    schedule 22.09.2016
comment
Привет Нишант, где это должно быть размещено - я должен удалить текущий возврат в блоке успеха   -  person Zabs    schedule 22.09.2016
comment
хм, все равно не доставляет удовольствия использовать это в блоке успеха .. :(   -  person Zabs    schedule 22.09.2016
comment
ваш ajax ничего не возвращает... это просто обратный вызов...   -  person Nishanth Matha    schedule 22.09.2016


Ответы (3)


дело в том, что когда вы отправляете HTTP-запрос, требуется некоторое время для обработки и отправки данных обратно в ваш код javascript. но поскольку javascript является асинхронным, он не ждет возврата ответа. так что либо вы можете вернуть весь http-запрос, как предложил Umakanta Behera, либо вы можете использовать функцию обратного вызова, чтобы дождаться ответного ответа.

this.getAccSignoffWords = function(callback) {
    var url = ApiService.getDomain() + 'account/signoff';
    $http({
        method : 'GET',
        url : url
    }).success(function(data) {
        if (data.success) {
            callback() data.words
        }
    }).error(function(data) {
        throw "Failed to get sign-off words";
    })['finally'](function(data) {

    });
}

вызовите эту функцию так

this.getAccSignoffWords(function(data){
     console.log(data) // your http response 
})
person Sachila Ranawaka    schedule 22.09.2016
comment
Можете ли вы указать, где вторая функция «вызова» идет по отношению к моему коду (это контроллер, служба, представление и т. д.) спасибо - person Zabs; 22.09.2016
comment
Вызовите это с вашего контроллера - person Sachila Ranawaka; 23.09.2016

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

var self = this;
var url = ApiService.getDomain() + 'account/signoff';
    $http({
        method : 'GET',
        url : url
    }).success(function(data) {
        if (data.success) {
            self.getAccSignoffWords = data.words; // I want to return this JSON to the scope
        }
    }).error(function(data) {
        throw "Failed to get sign-off words";
    })['finally'](function(data) {

    });
person Nishanth Matha    schedule 22.09.2016

Я думаю, что вы не перенастраиваете результат $ http. Не могли бы вы попробовать приведенный ниже код.

this.getAccSignoffWords = function() {
    var url = ApiService.getDomain() + 'account/signoff';
    return $http({
        method : 'GET',
        url : url
    }).success(function(data) {
        if (data.success) {
            return data.words; // I want to return this JSON to the scope
        }
    }).error(function(data) {
        throw "Failed to get sign-off words";
    })['finally'](function(data) {

    });

    // return [ 'static', 'words' ]; // this line is commented out and only used for testing and is an example of the type of data expected from data.words
}
person Umakanta Behera    schedule 22.09.2016
comment
спасибо, Умаканта, хотя это вызывает у меня ту же проблему, но хороший шанс - person Zabs; 22.09.2016
comment
похоже, у меня не работает, я делаю что-то глупое, я уверен, я продолжу это :) - person Zabs; 22.09.2016