如何正确使用Promise.all()和然后()与asynchronous函数?

在下面的代码中,我试图把第一个和第二个查询的结果放在一个名为result的全局variables中。 问题是Promise.all()没有等待查询完成, then()

我该如何解决?

码:

 var result = {}; Promise.all([ connection.query('SELECT * FROM analysis', function(err, rows, fields) { if (err) throw err; result.analysis = rows; console.log("query 1"); }), connection.query('SELECT * FROM analysis_description', function(err, rows, fields) { if (err) throw err; result.analysis_description = rows; console.log("query 2"); }) ]) .then(function(result){ console.log(result); console.log("result"); }); 

输出:

 result query 1 query 2 

就像在评论中所说的那样,你需要手动提示asynchronous调用:

 queryAsync = query => new Promise((resolve, reject) => { connection.query(query, (err, rows) => { if(err) return reject(err) resolve(rows) }) }) 

或者首选的方式是使用像bluebird这样的库:

 connection = require('bluebird').promisifyAll(connection) 

你的代码可以修改成:

 var result = {}; Promise.all([ connection.queryAsync('SELECT * FROM analysis').then(rows => result.analysis = rows), connection.queryAsync('SELECT * FROM analysis_description').then(rows => result.analysis_description = rows) ]).then(function(result){ console.log(result); console.log("result"); }).catch(e => console.error(e)); 

感谢大家! 像所有人都说的,问题出在Promise.all()中的错误参数上。 这是更改后的代码。

码:

 Promise.promisifyAll(require("mysql/lib/Connection").prototype) var result = {}; Promise.all([ connection.queryAsync('SELECT * FROM analysis') .then(function(rows){ console.log(rows); result.analysis = rows; }), connection.queryAsync('SELECT * FROM analysis_description') .then(function(rows){ result.analysis_description = rows; }) ]) .then(function(){ console.log(result); console.log("result"); });