2017-07-30 29 views
-2

我创建$ http服务并使用$ q。为什么我从http服务得到undefined?

这里是我的$ 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 = dataundefined进去。

任何想法,为什么我从服务中得到未定义?

回答

3

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

您可以通过删除1st 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); 
     } 
    ); 
} 
1

代替在.then方法,使用$q.defer,只需returnthrow到处理程序的功能的:

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̶;̶ 
    } 
} 

.then方法返回一个新诺这是通过successCallback的返回值解决或拒绝errorCallback(除非该值是一个承诺,在这种情况下,它将使用promise chaining中的承诺中解决的值来解决)。 1

通过错误返回与包含函数缺乏returnthrow声明该服务返回该解析为undefined一个承诺一个then方法的承诺。

欲了解更多信息,请参阅You're Missing the Point of Promises

相关问题