如何解决Promise在Node,Express,mongoDB中解析之前的页面呈现
为简单起见,我已删除了错误处理代码,以简化操作。
我有一个函数createOrder()
,该函数在MongoDB集合中创建了一条新记录:
createOrder = order => new Promise((resolve,reject) => {
Order.create({orderId: order});
resolve();
});
getOrders()
函数可将数据库中的所有当前订单添加到数组中。
getOrders = _ => new Promise((resolve,reject) => {
Order.find({buyerId: curUser.userId},(err,orders) => {
orders.map(order => order.status != 'cancelled' ? curUserOrders.push(order) : null);
});
resolve();
});
发布订单的外部javascript文件:
postOrder = () => {
window.location = `/new_order/order=${JSON.stringify(itemArray)}`;
}
和“获取”请求的节点应用程序:
app.get("/new_order/order=:order",(req,res) => {
createOrder(JSON.parse(req.params.order))
.then(getOrders)
.then(_ => res.render("userprofile",{user : curUser,orders: curUserOrders}));
});
当我发布新订单时,会触发postOrder()
功能并显示"userprofile"
,但是直到我再次刷新页面 时,才会显示任何订单。我仍在学习诺言的运作方式,因此我猜问题就在这里。请帮助:)。
解决方法
Promise用于异步操作,但是您的示例立即解决了Promise。
createOrder = order => new Promise((resolve,reject) => {
Order.create({orderId: order});
resolve();
});
您将编写create函数,例如:
createOrder(order).then(()=>{
// The asynchronous operation is completed!
})
但是对于您而言,它将发生以下情况:
createOrder = order => new Promise((resolve,reject) => {
//Start the asynchronous operation ....
Order.create({orderId: order});
//... but you just resolve the operation right away.
resolve();
});
另一个更好的例子可能是其他功能:
getOrders = _ => new Promise((resolve,reject) => {
Order.find({buyerId: curUser.userId},(err,orders) => {
orders.map(order => order.status != 'cancelled' ? curUserOrders.push(order) : null);
});
// You just resolve without waiting for the callback of find.
resolve();
});
您想要什么:
getOrders = _ => new Promise((resolve,orders) => {
orders.map(order => order.status != 'cancelled' ? curUserOrders.push(order) : null);
// Here we call resolve inside the callback and we wait for the find method and return the orders to the getOrders().then(orders => {}) call.
resolve(orders);
});
});
Promise就是这个名字的意思,它为您提供了一个承诺,它将在将来的某个时候实现(解决)。因此,您始终希望使用resolve函数,直到所有操作都完成而没有错误。
,将其用作此类回调
createOrder = order => new Promise((resolve,reject) => {
Order.create({orderId: order}).then(()=>{resolve});
});
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。