2017-02-09 3 views
1

こんにちは、私はAngularJSでこの機能コールを確認ボタンでRESTを使用しています。保存は大丈夫です。成功またはエラーメッセージで問題が発生します。 succededの場合はループの実行後に1つの成功メッセージしか表示されないか、何度も何度もエラーメッセージが表示されるはずです。エラーが発生した場合にはisErrorフラグを使用しましたが、ループの終了前に常にif(isError == false){"が実行されます。promise.thenでforeachの後にメッセージを1つだけ表示する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' 
      }); 
     } 
    }; 

誰もが提案をしていますか?

// 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を注入することを忘れないでくださいよう

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

何かの操作を行います。 おかげ

答えて

0

あなたは

代わりの解決すべての更新に基づいて成功トーストを表示するために$q.all()を使用することができますコントローラ内

+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呼び出しが完了しました。その結果、エラーが実際に発生する前に潜在的に実行されているため、フラグはfalseであり、ブランチに従います。

これは、DBロジックが約束を返すために発生します。プロミスは、残りのコードの実行をブロックしません.DBコールが実際に完了するまで、「then」コールバックに含まれるロジックを延期するだけです。したがって、あなたのコレクションに5つのアイテムがある場合は、それらのいずれかが実際に完了する前に、5つのアイテムすべてのDBコールを開始できます。重要なのは、DBの約束がすべて解決され、すべてのコールが完了したことを知るまで、成功のロジックを待たせる必要があることです。約束の詳細については、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 –

関連する問題