2017-02-09 28 views
1

你好傢伙我在AngularJS中使用REST在確認按鈕中調用此函數。保存沒問題,問題發生在成功或錯誤消息中。如果成功執行循環,它應該只顯示一條成功消息,或者不止一次顯示任何錯誤的錯誤消息。如果發生錯誤,我使用了一個標誌isError,但是不管我做什麼,「if(isError == false){」總是在循環結束前執行。只顯示一條消息後用promise保證。然後AngularJS

$scope.confirm = function() { 
     var isError = false; 
     var i=0; 
     $scope.displayedmodalcollection.forEach(function(item) { 
      i++; 
      delete item.added; 
      result = DataBase.update({ 
       id: item._id, 
       endpoint: item._type 
      }, item._source).$promise.then(function(response) { 

      }, function(err) { 
       isError = true; 
       if (err.status === 500) { 
        ngToast.create({ 
         className: 'warning', 
         content: String.format('Any message.', item._id) 
        }); 
       } 
       else if (err.status === 404) { 
        ngToast.create({ 
         className: 'danger', 
         content: '404 - other message' 
        }); 
       } else { 
        ngToast.create({ 
         className: 'danger', 
         content: 'Error' 
        }); 
       } 
      }); 
     }); 
     if (isError == false){ 

      ngToast.create({ 
       className: 'success', 
       content: 'Success' 
      }); 
     } 
    }; 

有沒有人有建議呢? 感謝

回答

0

你可以使用$q.all()顯示解決

而不是基於所有更新的成功舉杯:

$scope.displayedmodalcollection.forEach(function(item) { 

這樣做

// map array of update promises 
var updatePromises = $scope.displayedmodalcollection.map(function(item){ 
    // return the promise 
    return DataBase.update({...}).$promise.then(function(response) { 
       // success code 
      }, function(err) { 
       // error code 
      });  
});  

$q.all(updatePromises).then(function(){ 
     // all promises were resolved 
     ngToast.create({ 
       className: 'success', 
       content: 'Success' 
     }); 
}); 

記住注入$ Q in controller

+0

這並不確保成功敬酒發生在年底的循環雖然。 –

+0

@JeremyJackson啊對..我沒有注意到循環 – charlietfl

0

我不知道你想怎麼處理成功的更新和錯誤,但這應該把你在正確的軌道上:

$scope.confirm = function() { 
    var successes = 0; 
    var errors = 0; 
    $scope.displayedmodalcollection.forEach(function(item) { 
     delete item.added; 
     result = DataBase.update({ 
      id: item._id, 
      endpoint: item._type 
     }, item._source).$promise.then(function(response) { 
      successes++; 
      checkStatus(successes, errors); 
     }, function(err) { 
      errors++; 
      checkStatus(successes, errors); 
      if (err.status === 500) { 
       ngToast.create({ 
        className: 'warning', 
        content: String.format('Any message.', item._id) 
       }); 
      } else if (err.status === 404) { 
       ngToast.create({ 
        className: 'danger', 
        content: '404 - other message' 
       }); 
      } else { 
       ngToast.create({ 
        className: 'danger', 
        content: 'Error' 
       }); 
      } 
     }); 
    }); 
}; 

function checkStatus(successes, errors) { 
    var isCompleted = (successes + errors) == $scope.displayedmodalcollection.length; 
    var notAllFailed = successes > 0; 
    if (isCompleted && notAllFailed) { 
     handleSuccessToast(); 
    } 
} 

function handleSuccessToast() { 
    ngToast.create({ 
     className: 'success', 
     content: 'Success' 
    }); 
} 
0

的是,在isError == false分支的成功邏輯被所有的之前執行的問題數據庫調用已完成。因此,它在錯誤實際發生之前可能會運行,因此該標誌是錯誤的,並且遵循分支。

發生這種情況是因爲DB邏輯正在返回承諾。 Promise不會阻止執行其他代碼 - 它們只是推遲'then'回調中包含的邏輯,直到DB調用實際完成。因此,如果您的收藏中有5件商品,則可以在實際完成其中任何一件商品之前啓動所有5件商品的數據庫調用。關鍵是你需要讓你的成功邏輯等待,直到你知道所有數據庫承諾已經解決,並且所有的調用都完成。有關承諾的更多信息,請參閱this Promise guide

這裏是一個如何編寫你的邏輯等待所有承諾的例子,你檢查之前,如果任何錯誤發生到解決:

var doneCount = 0; 
var isError = false; 
something.foreach(item) { 
    somedblogic(item).$promise.then(function (response) { 
     if (++doneCount === something.length && !isError) { 
      //-- success logic here - runs one time after all db calls complete 
     } 
    },function (err) { 
     doneCount++; 
     isError = true; 
     //-- rest of error logic here - runs once for each error returned 
    }); 
} 
+0

謝謝@grumpyhoser,它真的解決了這個問題:D –

相關問題