2013-06-24 22 views
6

Mark Dalgleish đã viết một nice little article về cách sử dụng lời hứa trong khung nhìn AngularJS. Một số người đã đặt câu hỏi về điều này trong các ý kiến, nhưng Mark đã không trả lời họ (chưa). Bởi vì tôi đang hỏi tôi cùng một câu hỏi, tôi sẽ hỏi về StackOverflow thay vì để có được một câu trả lời:Sử dụng lời hứa trong AngularJS Views

  1. Nếu bạn sử dụng những lời hứa trong quan điểm, làm thế nào để xử lý "tải"/"chờ đợi" dấu hiệu, bởi vì họ không đồng bộ? Lời hứa có thứ gì đó như thuộc tính "đã giải quyết" hoặc "withinRequest" không?

  2. Làm cách nào để xử lý lỗi? Thông thường chúng sẽ phát sinh trong lần gọi thứ hai, nhưng nếu tôi sử dụng lời hứa trực tiếp trong quan điểm thì tôi không xử lý trường hợp này. Có cách nào khác không?

Cảm ơn bạn.

+0

chỉ đọc khoảng $ q trên tài liệu chính thức góc cạnh và hai câu hỏi trên sẽ được trả lời –

+2

Dường như #rtfm không giúp ích được gì, vì tôi không muốn sử dụng lời hứa theo chương trình nhưng từ trong chế độ xem như được mô tả trong câu hỏi/bài viết. Điều đó dường như không phải là một phần của tài liệu. – Pipo

Trả lời

13

CHỈNH SỬA: như góc cạnh v1.2 resolution of promise in views is not activated by default.

Độ phân giải lời hứa tự động trong chế độ xem giống như một công cụ tiện dụng lúc đầu nhưng có nhiều giới hạn cần được hiểu và đánh giá cẩn thận. Vấn đề lớn nhất với cách tiếp cận này là AngularJS, người sẽ thêm callback vào một lời hứa và chúng tôi có ít quyền kiểm soát nó.

Trả lời câu hỏi của bạn:

1) Như đã nêu, đó là cuối cùng AngularJS người sẽ thêm một callbacks thành công/lỗi vì vậy chúng tôi không có nhiều quyền kiểm soát ở đây. Những gì bạn có thể làm là để bọc các lời hứa ban đầu thành một tùy chỉnh mà sẽ theo dõi độ phân giải. Nhưng loại hình này làm hỏng toàn bộ mục đích của việc tiết kiệm vài lần nhấn phím. Và không, không có những thứ như 'giải quyết'. Tóm lại - không có cơ chế phổ biến để theo dõi tiến trình sẽ hoạt động cho tất cả các lời hứa. Nếu lời hứa của bạn là $http, bạn có thể sử dụng máy đánh chặn hoặc pendingRequests thuộc tính để theo dõi yêu cầu đang được tiến hành.

2) Bạn không thể. Một lần nữa, đó là AngularJS thêm một trình xử lý bên trong dịch vụ $parse và có vẻ như sau: promise.then(function(val) { promise.$$v = val; }); (xem mã here). Bạn có thể thấy rằng chỉ có một cuộc gọi lại thành công được thêm vào để tất cả các lỗi sẽ bị bỏ qua âm thầm.

Đó không phải là giới hạn duy nhất của độ phân giải lời hứa tự động trong chế độ xem. Vấn đề khác là lời hứa trả về bởi một hàm sẽ không được giải quyết đúng. Ví dụ, nếu bạn muốn viết lại một ví dụ như vậy:

myModule.controller('HelloCtrl', function($scope, HelloWorld) { 

    $scope.messages = function() { 
    return HelloWorld.getMessages(); 
    } 
}); 

và cố gắng sử dụng các đánh dấu sau:

<li ng-repeat="message in messages()"></li> 

mọi thứ sẽ làm việc như mong đợi, mà có thể đến như là một bất ngờ.

Tóm lại: trong khi độ phân giải lời hứa tự động có vẻ giống như phím tắt tiện dụng, nó có số lượng hạn chế và hành vi không rõ ràng. Đánh giá cẩn thận và quyết định xem việc lưu vài lần nhấn phím có đáng không.

+0

Cảm ơn bạn đã trả lời chuyên sâu. – Pipo

+2

"những lời hứa được trả về bởi một hàm sẽ không được giải quyết một cách chính xác", nhưng "mọi thứ sẽ hoạt động như mong đợi" - điều này không nên "không"? ;) – schellmax