2016-11-16 24 views
8

tôi quan sát rằng Trong góc 2 không có khối finally cho lời hứa APIkhối finally trong góc 2 lời hứa

góc 1:

loadUsers() { 
    fetch('/api/users').then((response) => { 
    return response.json(); 
    }).then((data) => { 
    this.users = data; 
    }).catch((ex) => { 
    console.error('Error fetching users', ex); 
    }).finally(() => { 
    this.userLoaded = true; 
}; 

Giả sử tôi phải làm điều tương tự ở góc 2

Làm thế nào để thêm cuối cùng chặn trong lời hứa góc 2, như bây giờ chỉ có then & catch blocks có sẵn trong góc 2. Nếu cuối cùng thì không có cách nào để thêm mã dọn dẹp sau khi thực hiện từng phương pháp, nơi tôi viết de để làm cuối cùng chặn các hoạt động?

+0

Bạn đã xem xét sử dụng các quan sát thay vì lời hứa? – jonrsharpe

+0

Trong tương lai: 'angularjs' dành cho câu hỏi AngularJS 1.x. –

+0

@jonrsharpe Đây có thể là một tuyên bố ý kiến, nhưng tôi cảm thấy các quan sát không giải quyết được cùng một miền vấn đề như lời hứa. – Katana314

Trả lời

1

Điều này thường được thực hiện bằng cách sử dụng Promise.always. Điều này có một chức năng và thêm .then mới vào lời hứa cung cấp chức năng tương tự cho cả trạng thái thành công và không thành công. Nếu chức năng không có sẵn trong môi trường hứa hẹn dựa trên đưa ra, nó khá dễ dàng để polyfill trong

Promise.always = function(p, fn) { 
    return p.then(fn, fn); 
} 

sử dụng:.

var prom = fetch('/api/users').then... 
Promise.always(prom,() => { 
    this.userLoaded = true; 
}); 
return prom; 
+0

Bạn không nên ** sửa đổi đối tượng 'Promise'. https://www.nczonline.net/blog/2010/03/02/maintainable-javascript-dont-modify-objects-you-down-own/ –

9

Cách đơn giản nhất để làm điều này là sử dụng promise.finally shim.

  • Thêm nó với npm install --save promise.prototype.finally
  • Thêm typings: npm install --save-dev @types/promise.prototype.finally
  • Trong lớp chính của bạn, trước khi bootstrapping ứng dụng, thêm đoạn mã sau:
import { shim } from 'promise.prototype.finally'; 
shim(); 

Bây giờ bạn sẽ có thể để sử dụng finally về lời hứa của bạn.

+0

Tôi gặp lỗi với bản 2.1.5 nói tất cả lời khai lời hứa phải có tuyên bố giống hệt nhau. –

+0

@ShyamalParikh may mắn rằng bản repo DefinitelyTyped đã được cập nhật với các kiểu gõ chính xác. Tôi đã cập nhật câu trả lời ở trên để phản ánh điều này. – fiznool

+1

@fiznool, Cảm ơn vì điều đó. Một điều cần thêm, (Tôi đang sử dụng Angular4) Tôi nghĩ tốt nhất là đặt shim trong tệp polyfills.ts. Tôi đã đặt thông tin sau ở cuối tệp đó '/ ************************************** ************************************************** *********** * KHUYẾN MÃI .finally SHIM */' ' nhập {shim as finallyShim} từ 'promise.prototype.finally'; finallyShim(); ' – PigBoT

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