我是一名新开发人员,正在研究一个相当复杂的场景,当用户保存时,可能会出现锁定,用户有机会过度锁定。如果有锁,由于REST是无状态的,我在PUT上发送的对象会丢失,所以我必须允许用户超过锁,然后再次发出放置请求。嵌套承诺 - 更好的方式?
在第二个如果检查你可以看到我有一个嵌套的承诺。根据我对承诺和回调的了解,这违背了使用承诺的目的。我通读了其他一些答案,但不理解在内部/嵌套承诺中返回承诺的概念。我如何重构下面的代码,使其更符合最佳实践,而不是嵌套承诺?
我是一名新开发人员,正在研究一个相当复杂的场景,当用户保存时,可能会出现锁定,用户有机会过度锁定。如果有锁,由于REST是无状态的,我在PUT上发送的对象会丢失,所以我必须允许用户超过锁,然后再次发出放置请求。嵌套承诺 - 更好的方式?
在第二个如果检查你可以看到我有一个嵌套的承诺。根据我对承诺和回调的了解,这违背了使用承诺的目的。我通读了其他一些答案,但不理解在内部/嵌套承诺中返回承诺的概念。我如何重构下面的代码,使其更符合最佳实践,而不是嵌套承诺?
您正在混合回调和承诺,并使其比它必须更难。 所有异步函数都应该返回一个承诺,而不是使用第二个.then()
作为错误处理程序,您应该让.catch()
函数处理这些错误。
此刻你的代码可以通过
$scope.$on('forceLockAfterModalSubmit', function(e, data) {
if (!$scope.newItemCreatedIsLocked) {
$scope.setLockForCurrentUser();
$scope.editMode = true;
}
if ($scope.newItemCreatedIsLocked) {
service.forceLock($scope.id)
.then(function() {
return itemService.updateItem($scope.itemForRequestBeforeLockResponse);
})
.then(function() {
return $scope.postPUTRequestActions($scope.itemForRequestBeforeLockResponse);
})
.catch(function(err) {
console.log(err);
});
}
});
取代,如果你想要一个更干净的解决方案,你可以声明调用您itemService.updateItem
和$scope.postPUTRequestActions
与作用域id
,你最终会功能与
$scope.$on('forceLockAfterModalSubmit', function(e, data) {
if (!$scope.newItemCreatedIsLocked) {
$scope.setLockForCurrentUser();
$scope.editMode = true;
}
if ($scope.newItemCreatedIsLocked) {
service.forceLock($scope.id)
.then(itemService.updateItem)
.then($scope.postPUTRequestActions)
.catch(function(err) {
console.log(err);
});
}
});
这是易于理解和遵循。
“*你应该处理'.catch()'*”中的任何错误 - 不一定,有非常好的理由使用第二个'then'参数,因为你有时需要[不同的东西](http://stackoverflow.com/q/24662289/1048572)。但是你是对的,一个通用的错误处理程序应该总是在链接的最后一个“catch”处进行。 – Bergi
@Bergi,好点和示例,尽管在这种情况下,第二个参数仅用作我想要解决的错误处理程序。我更新了我的答案! –
谢谢。不幸的是我在我的项目中使用jQuery的承诺,所以赶不上:) – devdropper87
对此很新,但也许这可能会有用。
另一个想法是,在第一个返回promise的函数中,你可能想调用另一个函数并使用setTimeout(function2,“insert milliseconds here”),虽然这会让你的文件在长期运行中放慢速度,一旦数据准备就绪......看起来对我来说很无聊,但它可能是短期的绷带。
在一个有点相关的说明你可能想写这样的事情来帮助提高可读性。
service.then(successFunction).catch(errorFunction);
function successFunction(response) {
if (response == "Valid Data") {
return response;
} else {
console.log("Something is wrong with the success function!");
return response;
}
functon errorFunction(response) {
console.log("Error occurred in the service!");
}
希望这有助于一些什么。
[删除嵌套的承诺](http://stackoverflow.com/a/22000931/1048572) – Bergi