无法执行链式承诺

Cannot execute chained promises

本文关键字:承诺 执行      更新时间:2023-09-26

我需要使用 $http.jsonp 获取提要,之后我返回deferred.resolve(feed) feed值应该传递给链式函数EntryStateUrlService.getEntryStateUrl

出于某种原因,它说FeedService.parseFeed(feedSrc)评估为undefined因此then()该方法不能在undefined上调用。如何解决?

app.service('LoadData', ['FeedService', 'EntryStateUrlService', '$q', function(FeedService, EntryStateUrlService, $q) {
    var deferred = $q.defer();
    this.loadData = function(feedSrc) {
        FeedService.parseFeed(feedSrc).then(EntryStateUrlService.getEntryStateUrl).then(function(urls) {
            $rootScope.links = urls;
        });
    }
}]); //TypeError: undefined is not a function
app.service('FeedService', function($http, $q) {
    var deferred = $q.defer();
    this.parseFeed = function(url) {
        $http.jsonp('//ajax.googleapis.com/ajax/services/feed/load?v=1.0&callback=JSON_CALLBACK&q=' + encodeURIComponent(url))
            .success(function(res) {
                deferred.resolve(res.data.responseData.feed.entries); //TypeError: Cannot read property 'responseData' of undefined
            }).error(function() {
                deferred.reject();
            });
 return deferred.promise(); //TypeError: object is not a function
    }
});
app.service('EntryStateUrlService', ['$state', '$q', function($state, $q) {
    var deferred = $q.defer();
    this.getEntryStateUrl = function(feeds) {
            var idx = 0;
            feeds.forEach(function(e) {
                $http.jsonp(e.link).success(function(data) {
                    /*stuff*/
                    deferred.resolve('root.' + generatedStateName);
                });
            }); //forEach
        } //getEntryStateUrl
return deferred.promise();
}]); //EntryStateUrlService

更新

在将return deferred.promise();添加到EntryStateUrlServiceFeedService后,我在FeedService return deferred.promise();得到了TypeError: object is not a function

在 FeedService 中返回 deferred.promise,同样在 EntryStateUrlService 中,调用 forEach 中的多个服务,因此,如果需要在所有服务完成后解析 promise,请使用 $q.all,如下所示。

app.service('LoadData', ['FeedService', 'EntryStateUrlService', '$q', function(FeedService, EntryStateUrlService, $q) {
    this.loadData = function(feedSrc) {
        FeedService.parseFeed(feedSrc).then(EntryStateUrlService.getEntryStateUrl).then(function(urls) {
            $rootScope.links = urls;
        }, function(failureException) {
            // failure error handler comes here.        
        });
    }
}]); //TypeError: undefined is not a function
app.service('FeedService', function($http, $q) {
    this.parseFeed = function(url) {
        var deferred = $q.defer();
        $http.jsonp('//ajax.googleapis.com/ajax/services/feed/load?v=1.0&callback=JSON_CALLBACK&q=' + encodeURIComponent(url))
            .success(function(res) {
                deferred.resolve(res.data.responseData.feed.entries); //TypeError: Cannot read property 'responseData' of undefined
            }).error(function() {
                deferred.reject();
            });
        return deferred.promise;
    }
});
app.service('EntryStateUrlService', ['$state', '$q', function($state, $q) {
    this.getEntryStateUrl = function(feeds) {
            var deferred = $q.defer();
            var idx = 0, promises = [];
            feeds.forEach(function(e) {
                $http.jsonp(e.link).success(function(data) {
                    /*stuff*/                    
                });
            }); //forEach
            // once all the jsonp service in the  for loop is finished, then resolve the promise
            $q.all(promises).then(function() {
                deferred.resolve('root.' + generatedStateName);
            }, deferred.reject);
            return deferred.promise;
        } //getEntryStateUrl
}]); //EntryStateUrlService

你不应该parseFeed函数返回延迟吗?

this.parseFeed = function(url) {
    $http.jsonp('//ajax.googleapis.com/ajax/services/feed/load?v=1.0&callback=JSON_CALLBACK&q=' + encodeURIComponent(url))
        .success(function(res) {
            deferred.resolve(res.data.responseData.feed.entries);
        }).error(function() {
            deferred.reject();
        });
    return deferred;
}

我的代码中缺少一个承诺。我认为你必须在你的FeedService中返回一个承诺:return deferred.promise();而不是return deferred;