我是一名新開發人員,正在研究一個相當複雜的場景,當用戶保存時,可能會出現鎖定,用戶有機會過度鎖定。如果有鎖,由於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