传递Promise中的变量

时间:2016-09-11 06:53:24

标签: javascript promise

我在我的应用程序中使用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}对象也是,但我不知道如何传递它。

有什么想法吗?

3 个答案:

答案 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()中设置。