2016-07-15 2 views
2

Я получаю ошибку 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

'GetData()' не возвращает ничего, если 'if' ложно. «Возврат» внутри обратного вызова не возвращается к внешней функции – charlietfl

+0

@charlietfl Существует строка, в которой говорится 'return storedData' в'. Then' инструкции else? –

+1

Это возвращается только в 'then()' ... он не возвращается к 'getData()'. Вам нужно будет вернуть обещание для обоих условий 'if' – charlietfl

ответ

1

Ваш getData() метод не имеет return, когда if является ложным. Поэтому вам нужно будет вернуть entitiyDataPromise.

Но это означало бы одно условие возвращает обещание и другие возвращает объект

Так оба условия должны вернуть обещание, и мы можем использовать $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'); 
+0

$ q - это объект без разрешения для меня - опции' all', 'defer' , 'reject' и' when' –

+0

не уверены, что вы имеете в виду ... это документированный метод – charlietfl

+0

Эта статья была полезна: http://www.bennadel.com/blog/2735-q-when-is-the -missing-q-resolve-method-in-angularjs.htm –

Смежные вопросы