在前端承诺中链接彼此依赖的服务器调用是不好的做法吗?

时间:2016-11-03 22:35:05

标签: javascript angularjs node.js promise mean-stack

我正在使用MEAN堆栈。

例如,在我的角度代码中,我可能会:

Brand.create({name: 'name'}).then(function(brand){

    //here, the product's referenced brand._id depends on the Brand response

    Product.create({'name':'name', 'category': 'food', 
       'brand': brand.data._id}).then(function(res){
         $scope.product = res.data;
   });
});

在服务器端执行此操作会更好 - 如果有人在调用第二个承诺之前刷新或丢失连接,似乎只会创建一个品牌 - 没有相关产品。

如果是这样,最好的做法是将两个不同的集合连接到其各自的控制器中吗?

1 个答案:

答案 0 :(得分:2)

  

在服务器端执行此操作会更好 - 如果有人这样做的话   在调用第二个promise之前刷新或丢失连接,似乎就是这样   可能导致只创建一个品牌 - 没有关联   产品

是。出于多种原因,最好在服务器端完成:

  1. 网络上较少的Ajax呼叫效果更好。因此,创建一个实现您正在尝试实施的更高级别操作的单个ajax调用将更有效。
  2. 您的逻辑和错误处理越接近数据源(例如数据库),就越容易可靠地编写和执行。
  3. 在事物中间丢失网络连接的情况是从客户端实施多步数据操作的问题的完美示例。
  4. 和。无论您在何处编写代码,都需要通过数据库中的某种事务系统或通过手动错误处理进行适当的错误处理,以便在以后的操作失败时解除先前的操作,这样您总是会得到一个有效的系统,即使是中间或后续步骤失败。在上面的客户端驱动方案中,您需要在.catch()上使用Produce.create()处理程序,因此如果失败,您可以从之前撤消Band.create(),这样您就可以将系统保持在正常状态有一个下游错误。注意,如果您从客户端管理多个步骤,那么面对客户端连接问题几乎是不可能的,但是当您从服务器完成连接问题的可能性更小时更加实用。