Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 混淆承诺和异步/等待_Javascript_Node.js_Express_Promise_Async Await - Fatal编程技术网

Javascript 混淆承诺和异步/等待

Javascript 混淆承诺和异步/等待,javascript,node.js,express,promise,async-await,Javascript,Node.js,Express,Promise,Async Await,我是NodeJS的新手。我实践承诺,并成功地运用了它。我所理解的是,使用一个承诺,您可以保留输出并发送resolve和reject。我用在数据库操作中 然后有人建议我使用async/awaits。这是我第一次成功运行的代码 shop.js文件 const models = require("../models"); const shopModel = models.Shop; exports.checkShop = function(shopName) { return new Promis

我是NodeJS的新手。我实践承诺,并成功地运用了它。我所理解的是,使用一个承诺,您可以保留输出并发送resolve和reject。我用在数据库操作中

然后有人建议我使用async/awaits。这是我第一次成功运行的代码

shop.js文件

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"
      );
  }
};
这就是我试图用async/awaits替换它的方法。但它不起作用

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));
    }
};
另一个文件呢

exports.getInstall = function(req, res) {
    const shop = req.body.shop;

    if (!cn(shop)) {
      var shopCheck =  shopController.checkShop(shop);
      try {
        if (shopCheck) {
          res.send(`Welcome back ${shopCheck.shop}`);
        } else {
//         else stuff
        }
      } catch (e) {
        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"
        );
    }
  };

每个在前面带有
async
关键字的函数将(显式或隐式)返回一个承诺

所以当你打电话给shopController.checkShop时,你要么

shopController.checkShop().then(.... )
或者使
getInstall
也成为一个异步函数,以便在其中使用
wait

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


如果您想使
getInstall
异步并在
checkShop
上使用
wait
,您必须像在
checkShop
中那样使用
try{}catch
捕捉潜在的拒绝

承诺的版本是好的。我正在努力使用async/await版本无效!事实上,您的第一个代码片段不起作用,因为您忘记了
if(rs)
条件下的
else
路径。这太完美了。但如何在async/await中返回拒绝状态?在承诺中,我可以简单地拒绝(错误),然后编写一个catch。如果您想使
getInstall
async并使用
wait
on
checkShop()
您必须使用
try{}捕获潜在的拒绝捕获
就像你在
checkShop
@picksrabhakar中所做的那样你可以
返回承诺。拒绝(…)
就像你所做的那样,或者你可以简单地
抛出…
一个例外。很高兴我能帮上忙!