2016-05-16 67 views
0

我是一名新開發人員,正在研究一個相當複雜的場景,當用戶保存時,可能會出現鎖定,用戶有機會過度鎖定。如果有鎖,由於REST是無狀態的,我在PUT上發送的對象會丟失,所以我必須允許用戶超過鎖,然後再次發出放置請求。嵌套承諾 - 更好的方式?

在第二個如果檢查你可以看到我有一個嵌套的承諾。根據我對承諾和回調的瞭解,這違背了使用承諾的目的。我通讀了其他一些答案,但不理解在內部/嵌套承諾中返回承諾的概念。我如何重構下面的代碼,使其更符合最佳實踐,而不是嵌套承諾?

​​
+2

[刪除嵌套的承諾](http://stackoverflow.com/a/22000931/1048572) – Bergi

回答

2

您正在混合回調和承諾,並使其比它必須更難。 所有異步函數都應該返回一個承諾,而不是使用第二個.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); 
     }); 
    } 
}); 

這是易於理解和遵循。

+0

「*你應該處理'.catch()'*」中的任何錯誤 - 不一定,有非常好的理由使用第二個'then'參數,因爲你有時需要[不同的東西](http://stackoverflow.com/q/24662289/1048572)。但是你是對的,一個通用的錯誤處理程序應該總是在鏈接的最後一個「catch」處進行。 – Bergi

+0

@Bergi,好點和示例,儘管在這種情況下,第二個參數僅用作我想要解決的錯誤處理程序。我更新了我的答案! –

+0

謝謝。不幸的是我在我的項目中使用jQuery的承諾,所以趕不上:) – devdropper87

-1

對此很新,但也許這可能會有用。

另一個想法是,在第一個返回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!"); 
 
    }

希望這有助於一些什麼。