2013-09-26 2 views
2

Я пытаюсь вернуть данные из $http.then функции:Как вернуть данные из функции HTTP Sucess

if(navigator.onLine){ 
    $http({ 
     method:'GET', 
     url:url, 
    }).success(function(data, status){ 
     localStorage.setItem('abc', JSON.stringify(data)); 
    }).then(function(){ 
     return JSON.parse(localStorage.getItem('abc')); 
    }); 
    }else{ 
    return JSON.parse(localStorage.getItem('abc')); 
    } 

Я могу получить данные JSon из else блока, но получить null значение из функции then.

И эта функция находится внутри службы.

ответ

5

Вы не можетreturn the response from an asynchronous call. Вам нужно вернуть обещание, т. Е. Результат метода .then.

Аналогичным образом, вы хотите вернуть (уже выполненное) обещание для данных из хранилища DOM.

if (navigator.onLine){ 
    return $http({ 
     method:'GET', 
     url:url 
    }).then(function(response) { 
     localStorage.setItem('abc', JSON.stringify(response.data)); 
     return response.data; 
    }); 
} else { 
    return $q.when(JSON.parse(localStorage.getItem('abc'))); 
} 
+0

когда я утешал возвращение, я получаю 'Объект {данные: Объект, состояние : 200, headers: function, config: Object} ' – Anenth

+0

@ Athenth: Ах, звучит разумно. В отличие от множества параметров «success' callback multiple,« $ http »обещает объект, которого интересует только свойство' .data'. Скорректировал мой ответ. – Bergi

+0

okey получил это! 'data.data.abc', чтобы получить данные – Anenth

0

Если вы хотите, чтобы сделать некоторую обработку, прежде чем «возвращение» вы можете создать другое обещание с помощью $q, он бы что-то вроде этого:

var defer = $q.defer(); 
if(navigator.onLine){ 
    $http({ 
    method:'GET', 
    url:url, 
    }).success(function(data, status){ 
    localStorage.setItem('abc', JSON.stringify(data)); 
    }).then(function(){ 
    defer.resolve(JSON.parse(localStorage.getItem('abc'))); 
    }); 
}else{ 
    defer.resolve(JSON.parse(localStorage.getItem('abc'))); 
} 
return defer.promise; 

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

В вызывающем абоненте вы будете делать что-то вроде этого (сказать, приведенный выше код относится к способу foo):

foo().then(function (data) { 
    // here data contains your returned JSON parsed object 
} 
+1

Нет! Не делай этого. Не нужно использовать другой '$ q.defer()', если вы можете использовать '.then()'. Это решение на самом деле не так, потому что оно не обрабатывает ошибки. – Bergi

+0

спасибо, он работает, но я не понял, когда я утешал возвращаемое значение, я получаю 'Object {then: function, catch: function, finally: function}', но данные корректно отображаются в ng-repeat – Anenth

+0

@Bergi, я согласен он не является полным, но вы можете определенно справиться с этим с использованием defere.reject (err) и т. д. Однако, я думаю, я соглашусь, что ваше решение проще. Это имеет смысл для меня в голове, хотя это все. :) – Mutahhir

Смежные вопросы