如何使用promises而不是回调来处理嵌套查询?

时间:2017-06-07 05:44:45

标签: mysql node.js express bluebird

我如何使用蓝鸟承诺执行以下操作。我使用的模块是bluebirdpromise-mysql

  1. 在表A中插入并返回a_id
  2. 使用a_id作为外键
  3. 在表B中插入记录
  4. 使用a_id作为外键
  5. 在表C中插入记录
  6. 现在响应将发送给用户,即添加所有记录。
  7. 我正在使用原生查询。

2 个答案:

答案 0 :(得分:3)

一般的想法是:

insetA()
  .then(function(a_id){
    return Promise.all([inserB(a_id), inserC(a_id)])
  })
  .then(function(){
     res.send("all good")
  })
  .catch(function(error){
     res.send("some error")
  })


function insetA(){
  return new Promise(function (resolve, reject) {
    // inserting A 
    // resolve(a_id)
  })
}

答案 1 :(得分:0)

我刚刚查看并看到promise-mysql库中的函数返回promises。你知道那是什么意思吗?您可以使用.then()链接其中的每一个。

以下是一个例子:

var mysql = require('promise-mysql');
var connection;

mysql.createConnection({
    host: 'localhost',
    user: 'sauron',
    password: 'theonetruering',
    database: 'mordor'
}).then(function(conn){
    connection = conn;
});

并在您的网络服务中:

return connection.query('insert into a values(. . . . .)')
    .then(function(rows){
        var a_id = rows.insertId;
        return connection.query('insert into b values(. . . . .)')
            .then(function(rows){
                return connection.query('insert into c values(. . . . .)');
            });
    });

您实际上可以在第一个.then(function(rows){})的末尾进行链接,但我只是想确保a_id不会存在于您插入表b和c的位置之外。