嵌套$ promise undefined错误

时间:2016-07-15 13:52:58

标签: angularjs angular-promise

我收到错误Cannot read property of '$promise' of undefined.

以下是抛出它的代码:

var myPromise = sharedDataService.getData($scope.entityId).$promise;
resolvePromise(myPromise, 'entityData');

resolvePromise方法:

function resolvePromise(promise, resultObject){
    promise.then(function(response){
        $scope[resultObject] = result;
    });
    promise['catch'](function(error){
        //error callback
    });
    promise['finally'](function(){
        //finally callback
    });

sharedDataService如下所示:

var publicInterface = {
    getData: getData
};

var storedData;
function getData(entityId) {
    if(storedData.entityId === entityId){
        return storedData;
    }else{
        var entityDataPromise = dataAccessService.getEntityData(entityId).$promise;
        entityDataPromise.then(function (response) {
            storedData = response;
            return storedData ;
         });
         entityDataPromise['catch'](function(error) {
              //throw error;
         });
         entityDataPromise['finally'](function(done) {
             //do finally
         });
    }
 }
 return publicInterface; 

最后,dataAccessService:

 var publicInterface = {
     getEntityData: getEntityData
 }

 var entityData = $resource(apiUrl + 'Entity', {}, {
     'getEntityData': {
         method: 'GET',
         url: apiUrl + 'Entity/getEntityDataById'
      }
 }

 function getEntityData(entityId){
     return entityData.getEntityData({entityId: entityId})
 }

 return publicInterface;

最初的承诺是抛出错误。当我把断点放在不同的地方时,我可以看到我的数据有时被返回。 sharedDataService的功能几乎就是一个chaching服务。

为什么我的原始承诺未定义?

1 个答案:

答案 0 :(得分:1)

getData()为假时,return方法没有if。所以你需要返回entitiyDataPromise

但是,这意味着一个条件返回一个promise而另一个条件返回一个对象

因此两个条件都需要返回一个承诺,我们可以使用$q作为第一个条件

function getData(entityId) {
    if(storedData.entityId === entityId){
        // return to getData()
        return $q.resolve(storedData);
    }else{
        var entityDataPromise = dataAccessService.getEntityData(entityId).$promise;
      // return to getData()
      return  entityDataPromise.then(function (response) {
            storedData = response;
            return storedData ;
         });
         entityDataPromise['catch'](function(error) {
              //throw error;
         });
         entityDataPromise['finally'](function(done) {
             //do finally
         });
    }
 }

请务必注入$q

在控制器中将是:

var myPromise = sharedDataService.getData($scope.entityId);
resolvePromise(myPromise, 'entityData');