从服务到控制器的承诺

时间:2014-11-15 21:08:31

标签: angularjs angular-promise

这可能取决于我没有完全理解角度的承诺。我无法看到哪里。

我有这项服务:

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:无法读取属性'然后'未定义的

我的服务承诺在哪里出错?

2 个答案:

答案 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
    }