2015-05-29 3 views
5

Итак, у меня есть приложение с угловым выражением, которое делает спокойные звонки на сервер. Существует служба, которая завершает вызовы на сервер. В настоящее время у меня есть метод службы, который просто возвращает обещание от службы $ http. Я хотел бы добавить дополнительную обработку этого вызова метода, но я не уверен, как это сделать из-за асинхронного характера обещания.Angular Service Promises

В настоящее время в машинописи:

class BoardService { 
    private $http; 

    constructor($rootScope: IRootScope, $http: ng.IHttpService) { 
      this.$http = $http; 
    } 

    fetchBoard(id: number) { 
     return this.$http.get("/api/board/" + id); 
    } 
} 

Я хотел бы получить его на что-то вроде этого:

fetchBoard2(id: number) { 
    this.$http.get("/api/board/" + id).success(function(data) 
    { 
     // Manipulate the data 

    }); 

    // return manipulated data; 
} 

Как бы вы это сделали?

ответ

10

Обманное предупреждение! Поскольку обещания асинхронны, все, что возвращает данные, основанные на данных из обещания, должно само по себе дать обещание. Вы хотите, чтобы fetchBoard2 вернул обещание, которое будет устранено после того, как обещание $http вернется и вы обработали данные. Вы делаете это с помощью услуги Angular's $q.

fetchBoard2(id: number) { 
    var deferred = $q.defer(); 

    $http.get("/api/board/" + id).success(function(data) { 
    var newData = doSomething(data); 
    deferred.resolve(newData); 
    }); 

    return deferred.promise; 
} 

Управления дополнительных отложенных объектов получает быстро неудобным, так что вы можете использовать then, чтобы вставить собственную манипуляцию в трубопровод.

fetchBoard3(id: number) { 
    return $http.get(...).then(function(data) { 
    return doSomething(data); 
    }); 
} 

Подробнее см. Здесь a good article.

+1

Насколько я знаю, .success() ведут себя так же, как .then() и возвращать тоже. return $ http.get(). success() тоже будет работать. – Okazari

+3

Почти - спасибо, что заставило меня проверить это. 'success' возвращает оригинальное обещание (содержащее HTTP-ответ), а' then' возвращает новое обещание, которое разрешено с результатом функции, которую вы ему даете. Ссылка: http://stackoverflow.com/a/23805864/802618 –

+1

Thx для добавления, теперь это не было точно. – Okazari

0

Модуль $http предоставляет только асинхронную версию XMLHttpRequest, поэтому подпись, которую вы ищете, невозможна. Если не хотите отступить к другой структуре (например, jQuery), вам придется использовать возвращаемый объект Promise.

Подумайте об этом как о фабричном объекте, с помощью которого вы регистрируете обработчики, которые будут вызываться, когда данные вернутся. Они могут быть закованы в цепочку, поэтому, если вы хотите обработать данные перед передачей их вниз по течению, вы можете просто сделать это в обработчике, который вы регистрируете с помощью then method. Любой результат, который вы вернете в обработчике, станет данными для следующего обработчика then.

(Пожалуйста, обратите внимание, что в отличие от success(), аргумент обработчика является IHttpPromiseCallbackArg типа не сами данные.)

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