如何正确使用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"); });