javascript - Node.js:返回原始 Promise 与新 Promise 实例

标签 javascript node.js typescript es6-promise

我正在尝试修复一些真正 Promise 繁重的代码,我正在尝试通过删除新的 Promise 声明并返回初始 Promise 来修复,但我正在尝试确保我正确翻译了之前和之后。下面我有一个示例,概述了需要更改的场景之一。我是否在代码前后遗漏了某些内容,或者我是否朝着正确的方向前进?另外,之后我能捕获所有被拒绝的错误吗?

之前:

    add(book: IBook, authorId: string): Promise<IBookModel> {
        let p = new Promise((reject, resolve) => {
            let newBook: IBook = new Book({…book});
            newBook.createInitialSetup();
            let bookReady = {... newBook};
            this.bookRepository.add(bookReady)
                .then((completedBook: IBookModel) => {
                    this.bookRepository.findAuthorById(authorId)
                        .then((author: IAuthorModel) => {
                            let newBookAuthor: IAuthorModel = new Author();
                            newBookAuthor(completedBook._id, author._id);

                            let finalBookAuthor = {... newBookAuthor} as IAuthor;

                            this.bookRepository.addBookAuthor(finalBookAuthor)
                                .then((result: IBookAuthorModel) => {
                                    resolve(completedBook);
                                })
                                .catch((err: Error) => {
                                    reject(err);
                                });
                        })
                        .catch((err: Error) => {
                            reject(err);
                        });
                })
                .catch((err: Error) => {
                    reject(err);
                });
        });

        return p;
    }

之后:

    add(book: IBook, authorId: string): Promise<IBookModel> {
         let groupSetup: IGroupModel = new Group({...group});
         newBook.createInitialSetup();
         let bookReady = {... newBook};

         return this.bookRepository.add(bookReady)
                    .then((completedBook: IBookModel) => {
                        return this.bookRepository.findAuthorById(authorId)
                                   .then((author: IAuthorModel) => {
                                        let newBookAuthor: IAuthorModel = new Author();
                                         newBookAuthor(completedBook._id, author._id);

                                        let finalBookAuthor = {... newBookAuthor} as IAuthor;

                                        return this.bookRepository.addBookAuthor(finalBookAuthor)
                                                    .then((result: IBookAuthorModel) => {
                                                           return completedBook;
                                         });                  
                        });
         });
    }

最佳答案

Async/await 可能会让您的代码更易于理解和阅读:

async add(book: IBook, authorId: string): Promise<IBookModel> {
    let newBook: IBook = new Book({ ...book });
    newBook.createInitialSetup();
    let bookReady = { ...newBook };
    let completedBook: IBookModel = await this.bookRepository.add(bookReady)
    let author: IAuthorModel = await this.bookRepository.findAuthorById(memberId)

    let newBookAuthor: IAuthorModel = new Author();
    newBookAuthor(completedBook._id, author._id);

    let finalBookAuthor = { ...newBookAuthor } as IAuthor;

    let result: IBookAuthorModel = await this.bookRepository.addBookAuthor(finalBookAuthor);
    return completedBook
}

几点说明:

  1. 不确定memberId是谁,原始代码中未定义
  2. 您可以使用 try/catch 包围整个代码,但由于您所做的只是转发错误,因此不需要这样做,因为如果任何等待的 Promise 失败,则返回的 Promise 将被拒绝
  3. 持保留态度,使用async/await的一般原理是有效的,但转换是在尖叫的婴儿背景下执行的,因此可能会出现错误。

关于javascript - Node.js:返回原始 Promise 与新 Promise 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48507483/

相关文章:

javascript - 为什么我在 IE 中重新加载此页面时收到 "Leave this page"消息?

javascript - 如果 id == 1,下面的 jQuery 代码将不起作用

javascript - ExpressJS 路由中的正则表达式

node.js - Passport 认证系统不工作

typescript - 如何在只有默认函数的 tsx 文件中使用状态

angular - 如何使用 Apollo 后端在 TypeScript Angular 应用程序中键入部分类型?

javascript - 填充node_modules

javascript - 返回对象的 ID 为零(在数据库中创建记录)

Angular:扩展服务和传递参数

javascript - 我想根据选中的复选框更改价格