2013-06-19 6 views
10

Jak mogę zapewnić, że funkcja complete() będzie działała niezależnie od wyniku wywołania $ http przy użyciu interfejsu API obietnic dostarczonego z Angular.js?

$http({ 
    method: 'POST', 
    url: submitUrl, 
    data: $scope.data 
}) 
.success(function(data) { 
     // execute this code on success 
}) 
.error(function(data) { 
     // execute this code on error 
}) 
.complete(function() { 
    // execute this code regardless of outcome 
}); 

Można tego użyć, aby ukryć ikonę pokrętła AJAX po zakończeniu żądania. Chcielibyście ukryć spinnera, niezależnie od wyniku wniosku.

+0

co chcesz osiągnąć w ten sposób? –

Odpowiedz

15

nie jestem największym na świecie ekspert w angularjs ale zrozumieć można to zrobić w następujący sposób:

whatever.then(function() { 
    // success code here 
}, function() { 
    // error code here 
    return true; // return anything that's not undefined (and not a `throw()`) to force the chain down the success path at the following then(). 
}).then(function() { 
    // "complete" code here 
}); 

Jesteś zasadniczo zmuszeni wymyślić coś z jednego lub więcej .then(), która jest $ q Promise tylko metoda.

+0

Ma sens. Drugi .then() jest wykonywany, gdy pierwszy zostanie rozwiązany lub odrzucony. – Failpunk

8

Jeśli nie obchodzi, czy wniosek jest udany, czy nie, to możesz przekazać tę samą oddzwanianie do success i error ...

var cb = function(response){ 
     // do something 
    }; 


    $http.post(submitUrl, $scope.data).success(cb).error(cb); 

    // OR 

    $http.post(submitUrl, $scope.data).then(cb, cb); 

Ale należy pamiętać, że success i error callbacks mieć inny podpis niż wywołania zwrotne od then.

Również obietnice są rozpoznawane przez silnik szablonów w kanciaste, co oznacza, że ​​w szablonach można traktować obietnice załączone do zakresu, jak gdyby były wartościami wynikowymi.

Oznacza to, że można to zrobić:

Kontroler:

$scope.article = $http.get('/articles/' + articleId); 

Szablon:

<article ng-cloak> 
    <h3>{{article.title}}</h3> 
    <div>{{article.content}}</div> 
</article> 

I widok zostanie zaktualizowany, gdy obietnica $http.get został rozwiązany.

+1

Przeczytam obietnice i silnik szablonowy, brzmi interesująco. – Failpunk

+0

Prawie 1 rok później, krótka notatka, która obiecuje (automatyczne) rozpakowanie w szablonach została [usunięta w wersji 1.2.0] (https://github.com/angular/angular.js/commit/fa6e411da26824a5bae55f37ce7dbb859653276d). – bernhardw

12

To zależy od tego, co chcesz zrobić, ale dla czystej się logiką i podobne mogą również skorzystać finally() uruchomić zarówno od spełnienia lub odrzucenia swojej obietnicy:

promise.finally(function() { 
    // Do something regardless of outcome. 
}); 

Należy pamiętać, że chociaż finally() jest obsługiwany przez $q (i kilka innych bibliotek) nie jest częścią official draft.

+0

ta praca dla mnie służyła do kontrolowania żądań ajax Zakończ i ukryj ładowanie ikon – vandersondf

Powiązane problemy