适当的复杂Q承诺,链接然后传播

时间:2016-07-19 00:47:36

标签: javascript node.js mongoose q

我使用我的快速路由进入Q承诺,只是想看看我是否使用这个示例以正确的方式使用它们。代码有效,但似乎可以更好地链接。

基本上我希望首先运行productPromise代码,if(product.nModified === 0)我希望路由以res.json({message: 'Produc...'});结束,并且Q.spread内的回调根本不会运行。

我认为目前productPromiseuserQuery正在评估Q.spreaduserQuery。这个例子很好,但是在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);
  });
});

如果我能解释得更好,请告诉我。 干杯!

0 个答案:

没有答案