在前端承诺中链接彼此依赖的服务器调用是不好的做法吗?
Is it bad practice to chain server calls that depend on each other within front end promises?
我正在使用 MEAN 堆栈。
例如,在我的 angular 代码中,我可能有:
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;
});
});
在服务器端执行此操作是否更好——如果有人在调用第二个承诺之前刷新或断开连接,似乎它可能只会创建一个品牌——而没有关联的产品。
如果是这样,最好的做法是在它们各自的控制器之一中连接两个不同的集合吗?
Would it be better to do this on the server side -- if someone were to
refresh or lose connection before the 2nd promise invoked, it seems it
could result in only a brand being created -- without an associated
product.
是的。出于多种原因,最好在服务器端完成:
- 通过网络调用的 Ajax 越少越好。因此,创建一个实现您尝试实现的更高级别操作的单个 ajax 调用会更有效。
- 您的逻辑和错误处理越接近数据源(例如数据库),就越容易可靠地编写和执行。
- 您的网络连接中断场景是从客户端实现多步数据操作时出现问题的完美示例。
还有。无论您在哪里编写代码,您都需要适当的错误处理,要么通过数据库中的某种事务系统,要么通过手动错误处理,当后面的操作失败时展开之前的操作,这样您总是会得到一个有效的系统,即使中间或后面的步骤失败。在上面的客户端驱动场景中,您需要 Produce.create()
上的 .catch()
处理程序,因此如果失败,您可以撤消之前的 Band.create()
,这样您就可以让系统处于正确的状态有下游错误。请注意,如果您从客户端管理多个步骤,这在面对客户端连接问题时几乎是不可能的,但如果从服务器完成则更实用,因为您不太可能出现连接问题。
我正在使用 MEAN 堆栈。
例如,在我的 angular 代码中,我可能有:
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;
});
});
在服务器端执行此操作是否更好——如果有人在调用第二个承诺之前刷新或断开连接,似乎它可能只会创建一个品牌——而没有关联的产品。
如果是这样,最好的做法是在它们各自的控制器之一中连接两个不同的集合吗?
Would it be better to do this on the server side -- if someone were to refresh or lose connection before the 2nd promise invoked, it seems it could result in only a brand being created -- without an associated product.
是的。出于多种原因,最好在服务器端完成:
- 通过网络调用的 Ajax 越少越好。因此,创建一个实现您尝试实现的更高级别操作的单个 ajax 调用会更有效。
- 您的逻辑和错误处理越接近数据源(例如数据库),就越容易可靠地编写和执行。
- 您的网络连接中断场景是从客户端实现多步数据操作时出现问题的完美示例。
还有。无论您在哪里编写代码,您都需要适当的错误处理,要么通过数据库中的某种事务系统,要么通过手动错误处理,当后面的操作失败时展开之前的操作,这样您总是会得到一个有效的系统,即使中间或后面的步骤失败。在上面的客户端驱动场景中,您需要 Produce.create()
上的 .catch()
处理程序,因此如果失败,您可以撤消之前的 Band.create()
,这样您就可以让系统处于正确的状态有下游错误。请注意,如果您从客户端管理多个步骤,这在面对客户端连接问题时几乎是不可能的,但如果从服务器完成则更实用,因为您不太可能出现连接问题。