簡體   English   中英

對Angular $ q promise使用.always()。error()語法

[英]Using .always().error() syntax for Angular $q promises

我為REST API只是在$ http周圍實現了一個瘦包裝,並且我希望它以與$ http相同的方式返回承諾(在我處理完數據之后)。

這是我的服務:

Services.service('Item', ['$http', '$q', function($http, $q){
    var deferred = $q.defer();
    var getSuccess = function(data, status, headers, config){
        var item = angular.copy(data);
        item.primaryImage = 'https://my.cdn.com/' + item.meta.images[0].s3id;

        if(item.meta.source_link !== null) {
            item.sourceLink = item.meta.source_link.url;
        }

        deferred.resolve(item, data, status, headers, config);
    };
    var getError = function(data, status, headers, config) {
        deferred.reject(data, status, headers, config);
    };

    this.get = function(userID, itemID) {
        $http({
            method: 'GET',
            url: '/api/items/' + userID + '/' + itemID
        }).success(getSuccess).error(getError);

        return deferred.promise;
    };
}]);

但是從我對文檔的理解來看,我必須像$http一樣使用.then(success, error, always)而不是.success().error().always()

是否可以以與$http相同的方式實現promise? 我很想這樣做

var req = Item.get($routeParams.userID, $routeParams.itemID);

req.success(function(item){
        window.console.log('Got an item!', item);
    });
    .error(function(item){
        window.console.log('Damn. It failed.')
    })

這個問題讓我在了解了您的實際需求后進行了搜索。

我做了一個plnkr,顯示了如何解決此問題: http ://plnkr.co/edit/LoCuwk26MEZXsugL1Ki5

現在,重要的部分是:

var promise = defered.promise;

  promise.success = function(fn) {
    promise.then(function(res) {
      fn(res);
    });
    return promise;
  };

  promise.error = function(fn) {
    promise.then(null, function(err) {
      fn(err);
    });
    return promise;
  };


  return promise

此代碼直接來自有角度的源代碼 因此,我認為如果要復制該樣式,這是必經之路。

我確實注意到您的代碼中有錯誤。 所有服務都是單例。 這意味着您只能創建一個延遲的對象。 您應該在每個呼叫上創建一個並使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM