为什么这一系列的承诺无序? "对象"最后.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
})
答案 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
给你,而不是每次都创建你自己的承诺。