2015-09-10 2 views
0

На самом деле, этот вопрос можно упростить, чтобы «вернуть результат $ http или рестатулярного вызова в обещание». Моя цель состоит в том, чтобы иметь объект обещание, что будет решен после того, как $ HTTP вызов завершается:

var deferredCall= $q.defer(); 

Тогда это разрешенное от вызова:

$http.get (url) 
    .then(function(result){ deferredCall.resolve('Success' + result);}, 
    function(){ deferredCall.resolve('Failure' + error);); 

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

deferredCall.promise.then(function (value) { 
    return //something to pass to controller; 
}); 

цель состоит в том, что контроллер инстанциируется является ли разрешать succeds или терпит неудачу. Моя проблема? Решение может принять только обещание, поэтому: `deferredCall.promise. Как я могу решить это обещание с помощью вызова выше, связанного с Решением/через службу? Являются ли результаты метода обслуживания обещанием?

Как, если я делаю услугу, чей метод вызывает вызов $ http, а затем возвращает отложенную транзакцию?

+0

Зачем вам нужно $ q для этого? –

+0

Я не знаю, как это сделать, используя angularjs. Это не я говорю: «Нет другого способа сделать это» - я просто не знаю, как подойти к этой проблеме в javascript. $ q была моей догадкой. Я ищу все, что достигнет конечной цели - получить обещание, которое возвращает результаты вызова $ http, если он терпит неудачу или преуспеет. Вызов должен быть вложен в другое обещание, потому что если вызов разрешения не выполняется, контроллер не создается. – VSO

+1

@VSO вам не нужно создавать другое обещание. Просто верните обещание '$ http.get'. –

ответ

3

Это, как мы решаем данные в нашем проекте:

углового $ routeProvider:

$routeProvider 
    .when('/something/something', { 
     templateUrl: 'somewhere/some-details.html', 
     controller : SomeController, 
     resolve : { 
      someItem : function (SomeService) { 
       return SomeService.getSomethingAll(); 
      } 
     } 
    }) 

Контроллер:

var SomeController = function ($scope, someItem) {}; 

Service Data:

.service('SomeService', function (SomeUtils, $http) { 
    return { 
     getSomethingAll : function() { 
      return SomeUtils.promiseHttpResult($http.get("api/something/all")); 
     } 
    } 
}) 

Utils Service :

.service("SomeUtils", function($q) { 
    return { 
     promiseHttpResult: function (httpPromise) { 
      var deferred = $q.defer(); 
      httpPromise.success(function (data) { 
       deferred.resolve(data); 
      }).error(function() { 
       deferred.reject(arguments); 
      }); 
      return deferred.promise; 
     } 
    } 
}) 

Ницца и простота. Никаких навыков не требуется :) (DD)

+0

Спасибо. Это то, что мне нужно. – VSO

+0

Вы уверены, что последний пример работает? В моем случае отсроченный.промисс просто принимается незамедлительно, не дожидаясь. Даже если я прокомментирую решение и отвергаю, он проходит через –

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