Angularjs 为什么我没有从http服务中定义?

Angularjs 为什么我没有从http服务中定义?,angularjs,Angularjs,我创建$http服务并使用$q 这是我的$http服务: function dashboardService($http, $log, $q, config) { var service = { getClientId: getClientIDByLayout, }; return service; function getClientIDByLayout(layoutId) { var deferred = $q.defer

我创建$http服务并使用$q

这是我的$http服务:

function dashboardService($http, $log, $q, config) {

    var service = {
        getClientId: getClientIDByLayout,
    };

    return service;

    function getClientIDByLayout(layoutId) {
        var deferred = $q.defer();
        return $http.get(config.baseUrl + "api/ClientLayoutMercator?layoutId=" + layoutId).then(function (result) {
            deferred.resolve(result.data);
        }, function (result) {
            deferred.reject(result);
        });

        return deferred.promise;
    }  
}
下面是我如何调用控制器内部的服务:

  dashboardService.getClientId(layoutId).then(function (data) {
      var t = data;//undifined
   });
但我在这一行中得到的结果是
var t=data
undefined


你知道为什么我没有从服务中定义吗?

基本上,你的
getClientIDByLayout
函数中有两个return语句,它们都返回
promise
本身。正如我看到的,您当前的实现正在创建新的
承诺
&手动管理拒绝/解决。但问题是第一个返回语句(
return$http.get(
)使其他返回语句(
return-deferred.promise
)变得多余。因此,第一个承诺从控制器返回到订阅。最终,
$http.get
不会返回任何内容,因此在随后的成功回调中,您会得到
未定义的

您可以通过删除第一条return语句轻松解决此问题,如下所示

function getClientIDByLayout(layoutId) {
    var deferred = $q.defer();
    //removed `return` from below code.
    $http.get(config.baseUrl + "api/ClientLayoutMercator?layoutId=" + layoutId).then(function (result) {
        deferred.resolve(result.data);
    }, function (result) {
        deferred.reject(result);
    });
    //custom promise should get return 
    return deferred.promise;
}  

理想情况下,创建被视为反模式的承诺开销,您可以利用
$http.get
返回的承诺。只需从其成功回调返回一个数据即可链接该承诺

代码

function getClientIDByLayout(layoutId) {
    ̶v̶a̶r̶ ̶d̶e̶f̶e̶r̶r̶e̶d̶ ̶=̶ ̶$̶q̶.̶d̶e̶f̶e̶r̶(̶)̶;̶
    return $http.get(config.baseUrl + "api/ClientLayoutMercator?layoutId=" + layoutId)
      .then(function (result) {
         //returning data from promise, it will provide it to subsequent `.then`
         return result.data;
      }, function (error) {
         ͟r͟e͟t͟u͟r͟n͟ $q.reject(error);
      }
    );
}  

不要使用
$q.defer
,而只需使用
中的处理程序函数。然后
方法:

function dashboardService($http, $log, ̶$̶q̶,̶ config) {

    var service = {
        getClientId: getClientIDByLayout,
    };

    return service;

    function getClientIDByLayout(layoutId) {
         ̶v̶a̶r̶ ̶d̶e̶f̶e̶r̶r̶e̶d̶ ̶=̶ ̶$̶q̶.̶d̶e̶f̶e̶r̶(̶)̶;̶
        return $http.get(config.baseUrl + "api/ClientLayoutMercator?layoutId=" + layoutId).then(function (result) {
            ̶d̶e̶f̶e̶r̶r̶e̶d̶.̶r̶e̶s̶o̶l̶v̶e̶(̶r̶e̶s̶u̶l̶t̶.̶d̶a̶t̶a̶)̶;̶ 
            return result.data;
        }, function (result) {
            ̶d̶e̶f̶e̶r̶r̶e̶d̶.̶r̶e̶j̶e̶c̶t̶(̶r̶e̶s̶u̶l̶t̶)̶;̶ 
            throw result;
        });

        ̶r̶e̶t̶u̶r̶n̶ ̶d̶e̶f̶e̶r̶r̶e̶d̶.̶p̶r̶o̶m̶i̶s̶e̶;̶
    }  
}
。然后
方法返回一个新承诺,该承诺通过
成功回调
错误回调
的返回值来解析或拒绝(除非该值是一个承诺,在这种情况下,它是使用在该承诺中解析的值来解析的)

通过错误地返回带有
的承诺,然后
方法包含缺少的函数或语句,服务将返回解析为
未定义的承诺

有关详细信息,请参阅