2015-09-10 67 views
0

其實,這個問題可以簡化爲「返回一個$ http或Restangular調用結果的承諾」。我的目標是有一個承諾對象時解決的$ 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調用,然後返回deferredCall?

+0

爲什麼你需要$ q這個? –

+0

我不知道如何使用angularjs做到這一點。這不是我說「沒有其他方法可以做到這一點」 - 我真的不知道如何在javascript中處理這個問題。 $ q是我的猜測。我正在尋找任何能夠實現最終目標的承諾,即無論它失敗還是成功,都會返回$ http調用的結果。 DOES需要嵌套在另一個承諾中,因爲如果解析調用失敗,那麼控制器不會被實例化。 – 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('SomeService', function (SomeUtils, $http) { 
    return { 
     getSomethingAll : function() { 
      return SomeUtils.promiseHttpResult($http.get("api/something/all")); 
     } 
    } 
}) 

utils的服務:

.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

你確定最後一個例子有效嗎?就我而言,deferred.promise只需立即接受,無需等待。即使我評論解決和拒絕,它通過 –