我在我的应用程序中使用promise-mysql,我需要查询一本书的信息,然后检索一些与其作者相同的书籍。
代码:
return Promise.all([
pool.query(sql, id),
]).then(data=> {
var book = data[0][0];
if (book.author) {
var authorSql = "select * from authors where name = ? limit 10";
return pool.query(authorSql, book.author);
} else {
return Promise.resolve(book);
}
}).then(object=> {
if (object.id) {
// this is a book instance, return it back
return object
} else {
// this should an array of books
var booksWithSameAuthor = object;
// but how to get the origin book here, something like:
var book = xxxx
book.recommends_by_author = booksWithSameAuthor
return book
}
});
如图所示,在第二个then
函数中,object
可能是一个book
对象或一个像查询数据行的数组,在后面的情况下,我需要{{1}对象也是,但我不知道如何传递它。
有什么想法吗?
答案 0 :(得分:2)
整个代码段可以更改为
return Promise.all([
pool.query(sql, id),
])
.then(data=> {
var book = data[0][0];
if (book.author) {
var authorSql = "select * from authors where name = ? limit 10";
return pool.query(authorSql, book.author)
.then(object=>{
book.recommends_by_author = object;
return book;
});
} else {
return book;
}
});
你使用嵌套。然后(是的,我知道,你想避开金字塔) - 在嵌套中。然后你在书上设置recommends_by_author
属性
注意,在.then中,返回Promise.resolve(book)
不是必需的,因为.then会默认返回一个Promise - 所以,return book
就足够了,两者都在“main”中。然后在内部.then
答案 1 :(得分:1)
如果需要通过promise链传递多个值,则可以传递一个对象,而不是一个值。
return {
book: book,
somethingElse: obj
};
在您的下一个.then()
功能中,您可以检索它:
.then(data => {
console.log(data.book);
console.log(data.somethingElse);
})
答案 2 :(得分:0)
您可以使用.then链接第二个pool.query并更改book对象。
...
return pool.query(authorSql, book.author).then(authors => {
book.authorList = authors;
return Promise.resolve(book);
});
...
然后你可以检查book.authorList是否在最后的.then()中设置。