我正在尝试修复一些真正 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
}
几点说明:
- 不确定
memberId
是谁,原始代码中未定义 - 您可以使用
try/catch
包围整个代码,但由于您所做的只是转发错误,因此不需要这样做,因为如果任何等待的 Promise 失败,则返回的Promise
将被拒绝 - 持保留态度,使用
async/await
的一般原理是有效的,但转换是在尖叫的婴儿背景下执行的,因此可能会出现错误。
关于javascript - Node.js:返回原始 Promise 与新 Promise 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48507483/