Javascript 混淆承诺和异步/等待
我是NodeJS的新手。我实践承诺,并成功地运用了它。我所理解的是,使用一个承诺,您可以保留输出并发送resolve和reject。我用在数据库操作中 然后有人建议我使用async/awaits。这是我第一次成功运行的代码 shop.js文件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
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
oncheckShop()
您必须使用try{}捕获潜在的拒绝捕获
就像你在checkShop
@picksrabhakar中所做的那样你可以返回承诺。拒绝(…)
就像你所做的那样,或者你可以简单地抛出…
一个例外。很高兴我能帮上忙!