在承诺和异步/唤醒之间感到困惑

时间:2019-06-23 11:40:08

标签: javascript node.js express promise async-await

我是Node JS的新手。我实践诺言并成功使用了诺言。我了解的是,使用诺言可以保留输出并发送确定和拒绝。我用于数据库操作。

然后有人建议我使用异步/唤醒。这是我的代码,第一次成功运行。

shop.js文件

tableView.estimatedRowHeight // whatever you want
tableView.rowHeight = UITableView.automaticDimension

还有我称之为的文件

const models = require("../models");
const shopModel = models.Shop;
exports.checkShop = function(shopName) {
  return new Promise((reslove, reject) => {
    shopModel
      .findOne({ where: { shop: shopName } })
      .then(rs => {
        if (rs) {
          reslove(rs);
        }
      })
      .catch(err => {
        reject(err.toString());
      });
  });
};

这就是我尝试用异步/唤醒替换它的方式。但这不起作用。

const shopController = require("./shop");
exports.getInstall = function(req, res) {

  const shop = req.body.shop;

  if (!cn(shop)) {
    shopController
      .checkShop(shop)
      .then(
        shopCheck =>
          function() {
            if (shopCheck) {
                res.send(`Welcome back ${shopCheck.shop}`);
            } else {
           //my else stuff
            }
          }
      )
      .catch(
        e =>
          function() {
            res.state(500).send(e);
          }
      );
  } else {
    return res
      .status(400)
      .send(
        "Missing shop parameter. Please add ?shop=your-development-shop.myshopify.com to your request"
      );
  }
};

另一个文件

exports.checkShop = async function(shopName) {
    try{
      var rs = await shopModel.findOne({ where: { shop: shopName } });
      if(rs){
        return rs;
      }
      else{
        return false;
      }
    }
    catch(e){
      return Promise.reject(new Error(400));
    }
};

1 个答案:

答案 0 :(得分:1)

每个带有async关键字的函数(显式或隐式)之前都会返回承诺。

因此,当您致电shopController.checkShop时,您要么必须做类似的事情

shopController.checkShop().then(.... )

或将getInstall设为异步函数,以便您可以在其中使用await

exports.getInstall = async function(req, res) {
   // other code here.. 
   const result = await shopController.checkShop(shop);
   //.. 
}

修改

如果您要使getInstall异步并在await上使用checkShop,则必须像在try {} catch中一样,使用checkShop来捕获潜在的拒绝。 。