承诺不能正常工作

我试图用MySql做一个嵌套的查询,把结果放在一个variables里,并通过http发送,但程序总是运行console.log("test 2:"+rpsData); 在查询完成之前。 我已经尝试过,但仍然遇到同样的问题。

 const express = require('express') const app = express() const mysql = require('mysql'); const Connection = require('mysql/lib/Connection'); const Promise = require('bluebird'); Promise.promisifyAll([ Connection ]); const connection = mysql.createConnection({ host : 'localhost', user : 'root', password : 'root123', database : 'mygallery' }); app.get('/posts', function(request, response) { var rpsData; connection.connectAsync() .then(function() { connection.query('SELECT * FROM post WHERE approved = 1', function(err, rows, fields) { if (err) throw err; rpsData = rows; for (var i in rows) { connection.query('SELECT * FROM image WHERE postCode = ?', [rpsData[i].postCode], function(err, rows, fields) { if (err) throw err; rpsData[i].image = rows; console.log("test 1:"+rpsData); }); } }); }) .then(function() { response.send(rpsData); console.log("test 2:"+rpsData); }) .catch(function(error) { console.error('Connection error.', error); }); }); 

这里发生的事情是你没有把所有的asynchronous代码捆绑到承诺链上。 一旦我们将其转换为这样做,这应该工作。

首先让包装调用connection.query返回一个承诺。 然后,我们必须返回所产生的承诺,将其附加到外部承诺链上。

如果你没有返回一个承诺,它就不会知道它必须等待你的代码完成执行,并且会在外部promise(来自connection.connectAsync )的下一个.then()语句前进。

您需要对内部查询应用相同的处理。

示例代码:

 app.get('/posts', function(request, response) { connection.connectAsync() .then(function() { return new Promise(function(resolve, reject) { connection.query('SELECT * FROM post WHERE approved = 1', function(err, rows, fields) { if (err) reject(err); resolve(rows.reduce(function(accumulator, current) { return accumulator.then(function(rpsData){ return new Promise(function(resolve, reject){ connection.query('SELECT * FROM image WHERE postCode = ?', [current.postCode], function(err, rows, fields) { if (err) reject(err); current.image = rows; console.log("test 1:"+rpsData); resolve(rpsData); }); }); }); }, Promise.resolve(rows))); }); }); }) .then(function(rpsData) { response.send(rpsData); console.log("test 2:"+rpsData); }) .catch(function(error) { console.error('Connection error.', error); }); }); 

我使用我在这里描述的技术排队内部承诺