Javascript 在角度路由解析中使用多个承诺修改项目数组
在路由解析中,我需要进行一个API调用并返回一组书籍,如下所示:Javascript 在角度路由解析中使用多个承诺修改项目数组,javascript,arrays,angularjs,angular-promise,Javascript,Arrays,Angularjs,Angular Promise,在路由解析中,我需要进行一个API调用并返回一组书籍,如下所示: { id: 1, name: 'Book name', authorId: 123 } 然后,我需要对books数组中的每本书进行另一个API调用,以返回作者姓名并将其添加到book对象中 { id: 1, name: 'Book name', authorId: 123, authorName: 'Author Name' } 到目前为止,我有以下内容,但它不起作用,因
{
id: 1,
name: 'Book name',
authorId: 123
}
然后,我需要对books数组中的每本书进行另一个API调用,以返回作者姓名并将其添加到book对象中
{
id: 1,
name: 'Book name',
authorId: 123,
authorName: 'Author Name'
}
到目前为止,我有以下内容,但它不起作用,因为只有在归还书籍后才能解决authorPromise问题。我如何正确地分割这些承诺,并按预期修改book对象
resolve : {
books: function ($stateParams, booksService, authorsService) {
var books = [];
var categoryId = $stateParams.categoryId;
booksService.getBooksByCategory(categoryId)
.then(function (response) {
books = response.data;
angular.forEach(books, function (book) {
var authorId = book.authorId;
authorsService.getAuthor(authorId)
.then(function (response) {
book.authorName = response.data.Name;
});
});
return books;
});
}
}
基本上,代码中有两个错误:
- factory函数不返回任何值,您应该返回由
生成的承诺bookservice
- 在第一个
然后
调用的回调中,在任何异步调用完成之前返回数组,因此它将为空。要解决这个问题,您可以使用
,这是一个函数,它接受一个承诺数组作为参数,并创建一个新的承诺,该承诺仅在数组中的所有承诺都已解析时才会解析$q.all()
谢谢你的帮助。您能否更详细地解释一下如何确保路由器等待第二系列请求完成?我想这和我最初尝试时遇到的问题是一样的。谢谢,你说得对。我错过了返回的承诺上的
,然后
。编辑了答案。
resolve : {
books: function ($q, $stateParams, booksService, authorsService) {
var books = [];
var categoryId = $stateParams.categoryId;
return booksService.getBooksByCategory(categoryId)
.then(function (response) {
books = response.data;
var promises = [];
angular.forEach(books, function (book) {
var authorId = book.authorId;
var promise = authorsService.getAuthor(authorId)
.then(function (response) {
book.authorName = response.data.Name;
});
promises.push(promise);
});
return $q.all(promises).then(
function (res) {
return $q.resolve(books);
}
);
});
}
}