2016-06-15 28 views
25

Tôi đang sử dụng SQLStorage từ nền tảng Ionic. Hàm remove sẽ trả về một lời hứa. Trong mã của tôi, tôi cần phải loại bỏ nhiều giá trị. Khi tất cả đã xong, tôi cần thực thi một số mã.Angular2 chờ cho nhiều lời hứa kết thúc

Làm cách nào tôi có thể chờ tất cả những điều này và sau đó thực thi chức năng gọi lại?

Code:

removeAll() { 

    this.storage.remove(key1); 
    this.storage.remove(key2); 
    this.storage.remove(key3); 

} 

lồng nhau tất cả là một thực tế xấu vì vậy tôi đang tìm kiếm một giải pháp phong nha :)

removeAll() { 

    return this.storage.remove(key1).then(() => { 

    this.storage.remove(key2).then(() => { 

     this.storage.remove(key3); 

    }); 

    }); 

}; 

Trả lời

39

Bạn có thể sử dụng

removeAll() { 
    Promise.all([ 
    this.storage.remove(key1), 
    this.storage.remove(key2), 
    this.storage.remove(key3), 
    ]).then(value => doSomething()); 

Xem thêm https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

+5

Tôi sẽ thêm rằng nếu bất kỳ lời hứa nào từ chối, 'Promise.all' sẽ ngay lập tức từ chối (cho dù phần còn lại đã kết thúc) và' then' sẽ bị bỏ qua. Nếu bạn cần chạy 'doSomething()' cho dù chúng thành công hay thất bại, bạn cần 'catch' mỗi cá thể riêng lẻ để trả về' Promise.resolve() '. –

+0

Với 'Promise.all()', họ sẽ bị truy tố từng cái một, hay tất cả cùng một lúc? – Robouste

+0

Tất cả các cuộc gọi được thực hiện ngay lập tức, sau đó 'Promise.all()' chỉ đợi tất cả các lời hứa này hoàn thành trước khi nó hoàn thành chính nó.Đây không phải là tính năng 'Promise.all'. Với mã này 'Promise.all ([ this.storage.remove (key1),', ...]); '' this.storage.remove (key1) 'được gọi và chỉ trả về giá trị (' Promise') được thêm vào mảng được chuyển đến 'Promise.all (...)' –

19

Bạn có thể sử dụng Observable.forkJoin từ rxjs bằng cách cung cấp một mảng của tất cả số observables/promises. Điều này cần được thực hiện trước khi thực hiện thao tác. Nó tương tự như $q.all của Angular 1.

Observable.forkJoin([ 
    this.storage.remove(key1), 
    this.storage.remove(key2), 
    this.storage.remove(key3) 
]) 
.subscribe(t=> { 
    var firstResult = t[0]; 
    var secondResult = t[1]; 
}); 
+0

Observable.forkJoin làm việc cho tôi. Rx.Observable.forkJoin thì không. – Ant

+1

Cảm ơn đã cập nhật câu trả lời –

1

Sử dụng Promise.all():

Các Promise.all phương pháp (iterable) trả về một lời hứa mà giải quyết khi tất cả các lời hứa trong đối số iterable đã được giải quyết, hoặc từ chối với lý do những người đầu tiên được thông qua lời hứa từ chối.

Cú pháp

Promise.all(iterable); 

thông số

iterable

Một đối tượng iterable, chẳng hạn như một mảng. Xem có thể lặp lại.

3

Tôi không quen thuộc với IONIC, nhưng giả sử storage.remove mà đang trở lại một lời hứa tôi sẽ đề nghị bạn sử dụng toán tử forkJoin từ quan sát.

ForJoin có một loạt các quan sát và đang chờ thực hiện tất cả các mục.

Chỉ cần thông báo rằng tôi đã phải tạo 3 quan sát mới từ mỗi lời hứa trả về bằng phương thức .remove.

Observable.forkJoin([ 
 
    Observable.fromPromise(this.storage.remove(key1)), 
 
    Observable.fromPromise(this.storage.remove(key2)), 
 
    Observable.fromPromise(this.storage.remove(key3)) 
 
]) 
 
.subscribe(data => { 
 
    console.log(data[0]); 
 
    console.log(data[1]); 
 
    console.log(data[2]); 
 
});

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