2013-06-19 32 views
10

Làm cách nào để đảm bảo rằng hàm complete() sẽ chạy bất kể kết quả của cuộc gọi $ http sử dụng API lời hứa được cung cấp với 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 
}); 

Người ta có thể sử dụng công cụ này để ẩn biểu tượng máy quay AJAX khi yêu cầu hoàn tất. Bạn sẽ muốn ẩn spinner bất kể kết quả yêu cầu.

+0

bạn muốn đạt được điều gì bằng cách này? –

Trả lời

15

Tôi không phải là chuyên gia lớn nhất thế giới trong Angular.js nhưng hiểu bạn có thể làm như sau:

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 
}); 

Bạn đang yếu buộc phải xoay sở một cái gì đó từ một hoặc nhiều .then(), mà là một lời hứa của $ q chỉ có phương pháp.

+0

Làm cho tinh thần. Thứ hai .then() được thực hiện khi lần đầu tiên được giải quyết hoặc bị từ chối. – Failpunk

8

Nếu bạn không quan tâm nếu yêu cầu là thành công hay không, sau đó bạn có thể vượt qua callback cùng successerror ...

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


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

    // OR 

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

Nhưng lưu ý rằng successerror callbacks có một khác nhau chữ ký hơn số gọi lại then.

Ngoài ra, những lời hứa được công nhận bởi các công cụ khuôn mẫu trong góc, có nghĩa là trong các mẫu bạn có thể đối xử với những lời hứa gắn liền với một phạm vi như thể chúng là các giá trị kết quả.

Điều này có nghĩa rằng bạn có thể làm điều này:

Bộ điều khiển:

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

mẫu:

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

Và quan điểm sẽ cập nhật khi lời hứa $http.get đã được giải quyết.

+1

Tôi sẽ đọc lời hứa và công cụ tạo khuôn mẫu, nghe có vẻ thú vị. – Failpunk

+0

Gần 1 năm sau, một lưu ý nhanh rằng lời hứa (tự động) unwrapping trong các mẫu đã được [gỡ bỏ trong phiên bản 1.2.0] (https://github.com/angular/angular.js/commit/fa6e411da26824a5bae55f37ce7dbb859653276d). – bernhardw

12

Nó phụ thuộc vào những gì bạn muốn làm, nhưng cho logic dọn dẹp và tương tự bạn cũng có thể sử dụng finally() để chạy hoặc thực hiện hoặc từ chối lời hứa của bạn:

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

Xin lưu ý rằng mặc dù finally() được hỗ trợ bởi $q (và một số thư viện khác) không phải là một phần của official draft.

+0

tác phẩm này dành cho tôi, tôi đã sử dụng để kiểm soát các yêu cầu kết thúc ajax và ẩn biểu tượng tải – vandersondf

Các vấn đề liên quan