2016-05-24 4 views
0

Ich habe den folgenden Code, der eine Meldung zeigt an, ob ein Versprechen nicht nach fünf Sekunden zurückkehrt:zeigen eine Meldung auf Timeout, für nur 2 Sekunden

$timeout(function() { 
     if (!$scope.promiseComplete && $scope.submitted) { 
      $scope.message = { 
      content: [{ 
       title: '', 
       msg: 'Service down - created' 
      }], 
      type: 'error' 
      }; 
      return; 
     } 
     }, 5000) 

Mein Dilemma ist, dass ich nur zeigen möchte Diese Nachricht selbst für zwei Sekunden. Ich habe folgendes versucht und es hat funktioniert, ist es ein Anti-Pattern, um Timeouts zu "nisten"?

$timeout(function() { 
     if (!$scope.promiseComplete && $scope.submitted) { 
      $scope.message = { 
      content: [{ 
       title: '', 
       msg: 'Service down - Railcar ASN created' 
      }], 
      type: 'error' 
      }; 
      $timeout(function(){ 
      $scope.message = null; 
      }, 2000) 
      return; 
     } 

     }, 5000) 

Update: basierend auf Antwort hier ist das, was mit Ich ging:

$timeout(function() { 
     if (!$scope.promiseComplete && $scope.submitted) { 
      $scope.message = { 
      content: [{ 
       title: '', 
       msg: 'Service down - created' 
      }], 
      type: 'error' 
      }; 
      return $timeout(function(){ 
      $scope.message = null; 
      }, 2000) 
     } 
     }, 5000) 

Antwort

1

$timeout ist Versprechen basiert, es gibt ein Versprechen, das verkettet werden können. Ja, verschachtelt $timeout s oder irgendwelche anderen Versprechen may be an antipattern.

Diese Art von Versprechen Kette

$timeout(function() { 
    if (!$scope.promiseComplete && $scope.submitted) { 
     ... 
     return $timeout(function(){ 
     $scope.message = null; 
     }, 2000) 
    } 
    }, 5000) 

garantiert, dass es nicht mehr als zwei Verschachtelungsebenen, und das Versprechen von oben $timeout zurückgegeben wird, kann genutzt werden, die ganzen Versprechen Kette kann verlängert oder getestet werden.

+0

Ich bearbeite meinen Beitrag mit der aktualisierten Antwort ... soll das so aussehen? Ich bin auch verwirrt, wie kommt es, dass das äußere Timeout zuerst läuft, dann das innere? – devdropper87

+0

Ja, so würde es aussehen. Die Reihenfolge der Ausführung ist die gleiche wie bei 'setTimeout'. Timeout-Callback-Funktion wird ausgelöst, sobald die Verzögerungszeit verstrichen ist, keine Millisekunde früher. – estus

+0

Ich verstehe. Wäre es nicht besser, am äußeren Timeout eine Kette anzulegen, die das innere Timeout enthält? – devdropper87