Angularjs服务混合$ resource和$ http

时间:2018-01-29 10:13:39

标签: javascript angularjs angularjs-service

我目前正在开发一项服务,可以确定控制器从哪里获取数据(外部网址或内部服务器)。

这是我的示例代码的一部分

//Controller
$q.all([
    CommonAPI.GetListing().$promise,
    ...
    ...
]).then(function(res){
    $scope.listing = res[0];
});

//CommonAPI service
function GetListing() {
    var externalURL = config.listingURL || '';

    if(externalURL) {
        return $http.get(externalURL);
    } else {
        return InternalAPI.GetListing(); //$resource service
    }
}

//InternalAPI service
.factory(...
    return $resource('Internal', {} , {
        GetListing: {
            method: 'GET',
            url: 'internal/listing'
        }
    }); ...

问题是,如果没有externalURL该功能可以使用$resource方法正常工作,但如果有externalURL且使用$http方法,则回复得到undefined

如果我将$q内的承诺更改为CommonAPI.GetListing()而没有.$promise,则可以使用$http方法,但不能使用$resource

有什么方法可以解决这个问题吗?我想我可以将其拆分为2个不同的服务,1个用于$http,1个用于$resource,并在$q之前进行条件检查,但我不愿意。

对此有任何帮助将不胜感激。感谢。

1 个答案:

答案 0 :(得分:0)

您是否尝试过返回承诺而不是$http.get()

像:

if(externalURL) {
    return new Promise((resolve, reject) => {
      $http.get(externalURL)
           .then(response => resolve(response))
           .catch(error => reject(error));
    }
}

您可以尝试的另一种方法是不使用$q.all,而是将您的逻辑拆分为2种方法。 首先检查是否存在externalURL,然后调用任一方法来处理数据:

if (externalURL) {
     // callHTTPMethod
} else {
    // call resource method
}

请注意,这样您可以更好地控制$q.all,但需要在各自的方法中单独处理每个响应。