2016-04-28 18 views
18

Một trong những trang của chúng tôi rất nặng. Để giảm số người theo dõi của chúng tôi và để đẩy nhanh chu kỳ tiêu hóa góc, chúng tôi đang sử dụng rất nhiều cú pháp On-Time-Binding ::. Chúng tôi cũng đang sử dụng angular-bind-notifier để tránh các đồng hồ không cần thiết trên các biểu thức của chúng tôi trên trang này.AngularJS digest postDigestQueue

Chiến lược này cho phép chúng tôi giảm chu kỳ tiêu hóa góc một cách đáng kể.

Nhưng chiến lược này có một xuống phía: Nó sử dụng $$postDigest (postDigestQueue) để unwatch biểu thức sau khi nó đã được đánh giá thành công.

Vậy thì sao?

Khi kết thúc thông báo, góc sẽ chạy qua postDigestQueue. Vì chúng tôi đã sử dụng rất nhiều biểu thức Bù giờ, postDigestQueue của chúng tôi có thể phát triển lên tới hơn 100 000 tác vụ được xếp hàng đợi.

Vấn đề là góc sử dụng following code để lặp qua hàng đợi:

while (postDigestQueue.length) { 
    try { 
    postDigestQueue.shift()(); 
    } catch (e) { 
    $exceptionHandler(e); 
    } 
} 

Phương pháp chuyển đổi loại bỏ phần tử tại chỉ số zeroeth và chuyển các giá trị tại các chỉ số liên tiếp xuống, sau đó trả về đã xóa giá trị.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/shift

Vâng, Array.prototype.shift() là lời kêu gọi rất tốn kém khi có rất nhiều yếu tố trong mảng.

Chu trình tiêu hóa của chúng tôi đôi khi sẽ mất hơn 20 giây vì lý do đó.

Khi chúng ta thay đổi mã trước đó với một sau, nó là cách nhanh hơn:

for (var i = 0; i < postDigestQueue.length; i++) { 
    try { 
    postDigestQueue[i](); 
    } catch (e) { 
    $exceptionHandler(e); 
    } 
} 
postDigestQueue.length = 0; 

Có một lý do tại sao họ đã làm điều đó? Chúng ta không nên sử dụng quá nhiều thời gian để ràng buộc?

Tôi có thể thấy một lý do: nếu công việc tự thêm nhiệm vụ cần vào hàng đợi. Là có thể? ($$postDigest là một hàng đợi riêng) Câu trả lời sẽ là sử dụng pop thay vì shift nếu thứ tự thực hiện không quan trọng, nhưng phải không?

Chỉnh sửa: Đơn đặt hàng có vẻ quan trọng vì postDigestQueue được sử dụng với hoạt ảnh.

Nếu có ai quan tâm đến việc theo dõi chính thức có thể, I opened an issue on the issue tracker.

+1

Tôi đã thêm vấn đề github của bạn vào câu hỏi. Đó là một câu hỏi rất quan trọng! – DrColossos

+1

Đó là một câu hỏi hay và dường như là một yêu cầu cải tiến thú vị. – Hitmands

+0

Đoán đơn giản của tôi là angularJS 1.x không được thiết kế để xử lý trang thực sự nặng, các trang chuẩn được cho là ánh sáng. Đây là lý do tại sao tất cả các lưới angularJS tinh khiết là địa ngục khi bạn có một lượng lớn dữ liệu và do đó chúng không tối ưu hóa các phần của mã của chúng. – Walfrat

Trả lời

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