使用Node-MySQL时,ES6承诺运行不正常

为什么这一系列的承诺失灵? 运行时未定义最终.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 }) 

你的return

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

…从querycallback返回,而不是callback; 返回值完全被忽略。 由于在callback函数中没有明确的return ,所以它返回一个undefined的promise,所以下面的callback函数被调用undefined (在上面的asynchronous工作完成之前)。

你需要返回一个值来立即使用或从thencallback承诺; 因为你的callback中的代码是asynchronous的,所以你需要返回一个你在asynchronous工作完成时解决的promise,所以:

 .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 }) }) }) }) 

你可以看看其中一个承诺的库 – 如果NodeJScallback,那么你可以直接在代码中使用promise。 至less有一对夫妇,然后你可以使用承诺,一个承诺, query给你,而不是每次都必须创build自己的。