【问题标题】:How to properly use Promise.all() and then() with async functions?如何正确使用 Promise.all() 和 then() 与异步函数?
【发布时间】:2016-09-06 05:41:45
【问题描述】:

在下面的代码中,我试图将第一个和第二个查询的结果放在一个名为 result 的全局变量中。问题是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

【问题讨论】:

标签: javascript node.js callback promise bluebird


【解决方案1】:

就像在 cmets 中所说,您需要手动承诺异步调用:

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));

【讨论】:

  • catch() 也会处理来自 promisified 函数的每个错误?
【解决方案2】:

谢谢大家!正如大家所说,问题出在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");
});

【讨论】:

    猜你喜欢
    • 2020-07-22
    • 2021-01-24
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    • 2020-11-16
    • 1970-01-01
    • 2019-12-21
    • 2020-08-03
    相关资源
    最近更新 更多