Javascript 如何正确地将Promise.all()和then()与异步函数一起使用?

Javascript 如何正确地将Promise.all()和then()与异步函数一起使用?,javascript,node.js,callback,promise,bluebird,Javascript,Node.js,Callback,Promise,Bluebird,在下面的代码中,我试图将第一个和第二个查询的结果放入名为result的全局变量中。问题在于Promise.all()不是等待查询完成,而是在继续执行then()之前 我怎样才能解决它 代码: 输出: result query 1 query 2 如评论中所述,您需要手动提示异步调用: queryAsync = query => new Promise((resolve, reject) => { connection.query(query, (err, rows) =>

在下面的代码中,我试图将第一个和第二个查询的结果放入名为
result
的全局变量中。问题在于
Promise.all()
不是等待查询完成,而是在继续执行
then()
之前

我怎样才能解决它

代码:

输出:

result
query 1
query 2

如评论中所述,您需要手动提示异步调用:

queryAsync = query => new Promise((resolve, reject) => {
  connection.query(query, (err, rows) => {
    if(err) return reject(err)
    resolve(rows)
  })
})
或者首选的方法是使用库,如:

您的代码可以修改为:

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()
中的错误参数中。这是更改后的代码

代码:


连接。查询是否返回承诺?承诺。全部接受承诺数组。这些看起来不像承诺:-)您需要“promisify”一个普通的异步回调函数来将其用作承诺:因为承诺是一个必须立即返回的值。有几种方法可以实现这一点。是的……其他人都这么说。看看这里—(插话)可能重复的
catch()
也会处理来自预期函数的每个错误吗?
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.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");
});