如何避免承诺中的回调

时间:2018-04-01 17:46:05

标签: javascript node.js callback promise bluebird

我是NodeJS和JavaScript的新手。我陷入了困境: 我想生成一些文字'的QR图像。在生成之后,我想查询我的MySQL数据库并将图像插入数据库。 问题是QRCode.toDataURL模块的SOLDAIR进入运行状态,并且在从.toDataUrl函数返回QR图像之前调用查询。 因此导致错误。

我尝试了一切,承诺,嵌套的承诺,计数器,if语句等,但我无法找到解决方案。

我的代码:

router.post('/generateTicket', (req,res) => {
  const query1 = `SELECT * FROM booking ORDER BY  bookingID DESC LIMIT 1`;
  const query2 = `INSERT INTO ticket (ticket_image,BookingID) SET ?`;
  let bookingID;
  let count;
  let ticket_data = {};
  Promise.using(mysql.getSqlConn(), conn => {
    conn.query(query1).then(resultOfQuery1 => {
      bookingID = resultOfQuery1[0].BookingID;
      count = resultOfQuery1[0].PeopleCount;

      console.log("ID = " + bookingID + " people count = "+count);

      promiseToCreateQRcode().then(function (URLfromResolve) {
        console.log("the url is " + URLfromResolve );
      }).catch(function (fromReject) {
        console.log("Rejected "+ fromReject);
      }); // catch of promise to create QR

    }).catch(err => {
      res.json({ status: 500, message: 'Error Occured in query 1 ' + err });
    }); // catch of query 1
  });
});


var opts = {
  errorCorrectionLevel: 'H',
  type: 'image/png',
  rendererOpts: {
    quality: 0.3
  }
};

let promiseToCreateQRcode = function () {
  let QRImage;
  return new Promise(function (resolve,reject) {
    QRCode.toDataURL('text', function (err, url) {
    if (err) throw err
      console.log("\n"+url+"\n");
      QRImage = url;
    });

    if (QRImage)
      resolve(QRImage);
    else
      reject("error occured in url");
  });
};

正如你所看到的,程序跳转到if语句并且还没有生成QR图像,因此它进入"拒绝":

image

2 个答案:

答案 0 :(得分:0)

试试这个,

let promiseToCreateQRcode = function () {
return new Promise(function (resolve,reject) {
    QRCode.toDataURL('text', function (err, url) {
        if (err){
          reject(err); // or some message
        } else {
           resolve(url);
      }
    });
  });
};

这样,只有当 toDataURL 返回QR图像时,才会解决承诺。

答案 1 :(得分:0)

看看How do I convert an existing callback API to promises?。您需要在异步回调中调用resolvereject

function promiseToCreateQRcode() {
    return new Promise(function(resolve,reject) {
        QRCode.toDataURL('text', function (err, url) {
            if (err) {
                reject(err);
            } else {
                console.log("\n"+url+"\n");
                resolve(url);
            }
        });
    });
}

cannot work一样使用这个额外的QRImage变量。