这可能取决于我没有完全理解角度的承诺。我无法看到哪里。
我有这项服务:
getSingleEventById : function(eventId)
{
var deferred = $q.defer();
$localForage.getItem('PublicEvents').then(function(results){
var found = $filter('filter')(results, {eventId: eventId}, true);
if (found.length)
{
deferred.resolve({'event':found[0]});
return deferred.promise;
} else {
return deferred.reject('not found');
}
});
},
从控制器调用:
$scope.event = myService.getSingleEventById($stateParams.eventId).then(function(foundEvent){
return foundEvent;
})
我在输出中看到的是: TypeError:无法读取属性'然后'未定义的
我的服务承诺在哪里出错?
答案 0 :(得分:2)
你只需要make getSingleEventById
方法返回Promise对象。因此,只需返回then
调用的结果即可。
此外,您可以通过删除冗余的deferred
对象来改进代码。您不需要它,因为从then
回调中返回的任何内容都将成为新的Promise对象,该对象将被传递到队列中的下一个then
。
getSingleEventById: function (eventId) {
return $localForage.getItem('PublicEvents').then(function (results) {
var found = $filter('filter')(results, {eventId: eventId}, true);
if (found.length) {
return {event: found[0]};
}
return $q.reject('not found');
});
},
注意如何返回return {event: found[0]};
个对象。这相当于之前的deferred.resolve({'event':found[0]});
,但不再创建一个中间deferred
对象。
答案 1 :(得分:1)
getSingleEventById : function(eventId)
{
var deferred = $q.defer();
$localForage.getItem('PublicEvents').then(function(results){
var found = $filter('filter')(results, {eventId: eventId}, true);
if (found.length)
{
deferred.resolve({'event':found[0]});
} else {
deferred.reject('not found');
}
});
return deferred.promise; // return the promise here
}