Запутан между обещанием и асинхронностью / ожиданием - PullRequest
2 голосов
/ 23 июня 2019

Я новичок в Node JS.Я практикую обещание, и я успешно использовал его.Насколько я понимаю, с помощью обещания вы можете сохранить вывод и отправить решение и отклонить.Я использовал в работе с базой данных.

Тогда кто-то предложил мне использовать async / awaits.Итак, вот мой код, который успешно запустился в первый раз.

shop.js file

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

И другой файл

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

1 Ответ

1 голос
/ 23 июня 2019

Каждая функция с ключевым словом 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...