我使用我的快速路由进入Q承诺,只是想看看我是否使用这个示例以正确的方式使用它们。代码有效,但似乎可以更好地链接。
基本上我希望首先运行productPromise代码,if(product.nModified === 0)
我希望路由以res.json({message: 'Produc...'});
结束,并且Q.spread
内的回调根本不会运行。
我认为目前productPromise
和userQuery
正在评估Q.spread
和userQuery
。这个例子很好,但是在then
密集的情况下,我希望除非必要,否则不要对它进行评估。
编辑:我只想链接spread
但是,我需要在最终版本中访问promises(产品,用户)的返回值({{1回调。
router.post('/cartAddProduct', auth, function(req, res, next){
var newCartItem = {
product: req.body._id,
quantity: req.body.quan
};
var userQuery = User.update({username: req.payload.username, 'cart.product': {$ne: newCartItem.product}},
{$push: {cart: newCartItem}}).exec();
var productQuery = Product.findById({_id:req.body._id, quantity: {$gte: newCartItem.quantity}}).exec();
var productPromise = productQuery
.then(function(product){
if(product.nModified === 0) {
res.json({message: 'Product no longer has sufficient quantity in stock.'});
}else{
return product;
}
});
Q.spread([productPromise, userQuery],function(product, user){
if(!user.nModified){
res.json({message: 'Item is already in your cart.'});
}else{
product.quantity -= newCartItem.quantity;
product.save();
res.json({message: 'Item added to cart', addedProduct: newCartItem});
}
})
.catch(function(err){
console.log(err);
});
});
如果我能解释得更好,请告诉我。 干杯!