无法执行链式承诺
Cannot execute chained promises
我需要使用 $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();
添加到EntryStateUrlService
和FeedService
后,我在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;
相关文章:
- Bluebird中承诺链数组的串行执行
- 执行一系列 Javascript 承诺一个接一个地解决
- 控制承诺执行顺序
- 如何按顺序执行承诺数组
- 无法执行链式承诺
- 循环超出范围,不执行承诺链
- 如何将 $http.put 封装到一个函数中,该函数执行某些操作,然后返回通过或失败的承诺
- 在猫鼬中创建承诺时,不会调用执行器
- 嵌套承诺执行不同步
- nodeJS中的承诺/承诺中的回调/执行顺序是不对的
- 两个捕获的承诺/块声明都没有执行
- 从数组中按顺序执行一堆 WinJS 承诺
- Javascript Jquery在外部样式表更改/重新加载承诺方式后执行代码
- $.延迟:如何检测每个承诺何时执行
- 无论承诺是否履行,如何执行相同的操作
- 链式jQuery承诺提前执行
- 承诺链不使用 Q 承诺库按顺序执行
- AngularJs 单元测试 - 模拟承诺不执行“然后”
- 如何使用本机 JavaScript 承诺执行延迟模式
- 链接承诺执行两个操作