使用Node-MySQL时,ES6 Promises乱序

时间:2016-04-16 07:56:12

标签: javascript mysql node.js promise

为什么这一系列的承诺无序? "对象"最后.then块中的对象在运行时未定义。

new Promise(function(resolve, reject) {

    getConnection().query("SELECT * FROM blog", (err, rows) => {
        if (err) reject(err)
        else resolve(rows)
    })

}).then(rows => {

    let posts = []

    for (let i = 0; i < rows.length; i++) {
        posts.push({
            id:      rows[i].id,
            ...
        })
    }

    return posts

}).then(posts => {

    getConnection().query("SELECT * FROM shows", (err, rows) => {
        if (err) throw new Error(err)
        else return { posts: posts, shows: rows }
    })

}).then(object => {

    let posts = object.posts

    let post_container = { my: [], your: [] }

    post_container.my   = posts.filter(x => x.section === "my")
    post_container.your = posts.filter(x => x.section === "your")

    return post_container

})

1 个答案:

答案 0 :(得分:4)

您的return

.then(posts => {

    getConnection().query("SELECT * FROM shows", (err, rows) => {
        if (err) throw new Error(err)
        else return { posts: posts, shows: rows }
    })

})

...从 query回调返回,而不是then回调;返回值完全被忽略。由于return回调中没有明确的then,因此会返回使用undefined解析的承诺,因此使用then调用以下undefined回调(之前和之后)上面的异步工作已完成。)

您需要返回要立即使用的值或来自then回调的承诺;由于then回调中的代码是异步的,因此您需要返回在异步工作完成时解决的承诺,因此:

.then(posts => {
    return new Promise((resolve, reject) => {
        getConnection().query("SELECT * FROM shows", (err, rows) => {
            if (err) reject(/*...reject reason...*/)
            else resolve({ posts: posts, shows: rows })
        })
    })
})

您可能会查看其中一个承诺的lib-ifies NodeJS回调,以便您可以在代码中更直接地使用promises。至少有一对,然后你可以使用承诺 - {if} ified query给你,而不是每次都创建你自己的承诺。