使用 mongodb 请求的 Promise 改进代码
Improve code with a Promise for a mongodb request
我是 javascript(和编码)的新手,我正在研究 Promises。
我有以下工作代码:
router.get("/test", function(req, res){
var mainCategory = new Promise(function(resolve, reject){
Maincategory.find().populate("subcategory").exec(function(err, allMaincategories){
if (err) {
console.log("error 1");
reject("error 2");
}
else {
resolve(allMaincategories);
}
});
});
var itemQuery = new Promise(function(resolve, reject){
Items.find({}, function(err, allItems){
if (err) {
console.log("error 3");
reject("error 4");}
else {
resolve(allItems);
reject("error 5");
}
});
});
Promise.all([
mainCategory,
itemQuery
]).then(function(allQueries){
console.log(allQueries);
var allCategories = allQueries[0];
var allItems = allQueries[1]
var userId = "true";
var show = "list";
res.render("test.ejs", {
allCategories: allCategories,
allItems: allItems,
userId: userId,
show: show
});
}).catch(function(error){
console.log("error 6");
res.render("error.ejs", {error: error});
});
});
问题 1:在这样的 promise 中使用回调是否正确?
问题 2:是否有一种(更短的)方式将所有 mongoose 请求放在一个 promise 中?
Mongoose 已经查询 return Promises - 因为您正在使用 Promises,所以最好 使用 Promise 它 returns 而不是构造一个与回调一起使用的新一个:
Promise.all([
Maincategory.find().populate("subcategory").exec(),
Items.find({})
]).then(function(allQueries){
// ...
mongoose 本身已经支持 promises,因此根本没有理由像您正在做的那样创建 promise。这个:
var mainCategory = new Promise(function(resolve, reject){
Maincategory.find().populate("subcategory").exec(function(err, allMaincategories){
if (err) {
console.log("error 1");
reject("error 2");
}
else {
resolve(allMaincategories);
}
});
});
应替换为
const subcatPromise = Maincategory.find().populate("subcategory").exec();
和
var itemQuery = new Promise(function(resolve, reject){
Items.find({}, function(err, allItems){
if (err) {
console.log("error 3");
reject("error 4");}
else {
resolve(allItems);
reject("error 5");
}
});
});
等同于
const itemsPromise = Items.find({});
router.get("/test", async function (req, res) {
try {
const allQueries = await Promise.all([Maincategory.find().populate("subcategory").exec(), Items.find({}).exec()]),
allCategories = allQueries[0],
allItems = allQueries[1],
userId = "true",
show = "list";
res.render("test.ejs", {
allCategories: allCategories,
allItems: allItems,
userId: userId,
show: show
});
} catch (error) {
console.log("error 6");
res.render("error.ejs", {
error: error
});
};
});
我是 javascript(和编码)的新手,我正在研究 Promises。
我有以下工作代码:
router.get("/test", function(req, res){
var mainCategory = new Promise(function(resolve, reject){
Maincategory.find().populate("subcategory").exec(function(err, allMaincategories){
if (err) {
console.log("error 1");
reject("error 2");
}
else {
resolve(allMaincategories);
}
});
});
var itemQuery = new Promise(function(resolve, reject){
Items.find({}, function(err, allItems){
if (err) {
console.log("error 3");
reject("error 4");}
else {
resolve(allItems);
reject("error 5");
}
});
});
Promise.all([
mainCategory,
itemQuery
]).then(function(allQueries){
console.log(allQueries);
var allCategories = allQueries[0];
var allItems = allQueries[1]
var userId = "true";
var show = "list";
res.render("test.ejs", {
allCategories: allCategories,
allItems: allItems,
userId: userId,
show: show
});
}).catch(function(error){
console.log("error 6");
res.render("error.ejs", {error: error});
});
});
问题 1:在这样的 promise 中使用回调是否正确?
问题 2:是否有一种(更短的)方式将所有 mongoose 请求放在一个 promise 中?
Mongoose 已经查询 return Promises - 因为您正在使用 Promises,所以最好 使用 Promise 它 returns 而不是构造一个与回调一起使用的新一个:
Promise.all([
Maincategory.find().populate("subcategory").exec(),
Items.find({})
]).then(function(allQueries){
// ...
mongoose 本身已经支持 promises,因此根本没有理由像您正在做的那样创建 promise。这个:
var mainCategory = new Promise(function(resolve, reject){
Maincategory.find().populate("subcategory").exec(function(err, allMaincategories){
if (err) {
console.log("error 1");
reject("error 2");
}
else {
resolve(allMaincategories);
}
});
});
应替换为
const subcatPromise = Maincategory.find().populate("subcategory").exec();
和
var itemQuery = new Promise(function(resolve, reject){
Items.find({}, function(err, allItems){
if (err) {
console.log("error 3");
reject("error 4");}
else {
resolve(allItems);
reject("error 5");
}
});
});
等同于
const itemsPromise = Items.find({});
router.get("/test", async function (req, res) {
try {
const allQueries = await Promise.all([Maincategory.find().populate("subcategory").exec(), Items.find({}).exec()]),
allCategories = allQueries[0],
allItems = allQueries[1],
userId = "true",
show = "list";
res.render("test.ejs", {
allCategories: allCategories,
allItems: allItems,
userId: userId,
show: show
});
} catch (error) {
console.log("error 6");
res.render("error.ejs", {
error: error
});
};
});