Javascript 在角度路由解析中使用多个承诺修改项目数组

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' } 到目前为止,我有以下内容,但它不起作用,因

在路由解析中,我需要进行一个API调用并返回一组书籍,如下所示:

{
    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);
                    }
                );
            });
    }  
}