Lý do:
Lý do undefined
là bạn đang thực hiện một hoạt động không đồng bộ. Có nghĩa là sẽ mất một khoảng thời gian để hoàn thành getEventList
phương pháp (phụ thuộc chủ yếu vào tốc độ mạng của bạn).
Vì vậy, chúng ta hãy nhìn vào cuộc gọi http.
this.es.getEventList()
Sau khi bạn thực sự thực hiện ("kích hoạt") yêu cầu http, subscribe
bạn sẽ đợi phản hồi. Trong khi chờ đợi, javascript sẽ thực thi các dòng bên dưới mã này và nếu nó gặp phải các phép gán / hoạt động đồng bộ, nó sẽ thực thi chúng ngay lập tức.
Vì vậy, sau khi đăng ký getEventList()
và chờ phản hồi,
console.log(this.myEvents);
dòng sẽ được thực hiện ngay lập tức. Và giá trị của nó là undefined
trước khi phản hồi đến từ máy chủ (hoặc bất cứ thứ gì mà bạn đã khởi tạo nó ngay từ đầu).
Nó tương tự như làm:
ngOnInit(){
setTimeout(()=>{
this.myEvents = response;
}, 5000);
console.log(this.myEvents); //This prints undefined!
}
Giải pháp:
Vậy chúng ta phải làm thế nào để khắc phục vấn đề này? Chúng tôi sẽ sử dụng hàm gọi lại là subscribe
phương thức. Bởi vì khi dữ liệu đến từ máy chủ, nó sẽ ở bên trong subscribe
cùng với phản hồi.
Vì vậy, thay đổi mã thành:
this.es.getEventList()
.subscribe((response)=>{
this.myEvents = response;
console.log(this.myEvents); //<-- not undefined anymore
});
sẽ in phản hồi .. sau một thời gian.
Bạn nên làm gì:
Có thể có nhiều việc phải làm với câu trả lời của bạn ngoài việc chỉ ghi lại nó; bạn nên thực hiện tất cả các thao tác này bên trong lệnh gọi lại (bên trong subscribe
hàm), khi dữ liệu đến.
Một điều khác cần đề cập là nếu bạn đến từ một Promise
nền tảng, thì lệnh then
gọi lại tương ứng subscribe
với có thể quan sát.
Những gì bạn không nên làm:
Bạn không nên cố gắng thay đổi hoạt động không đồng bộ thành hoạt động đồng bộ (không phải bạn có thể làm như vậy). Một trong những lý do mà chúng tôi có các hoạt động không đồng bộ là không bắt người dùng đợi một hoạt động hoàn thành trong khi họ có thể làm những việc khác trong khoảng thời gian đó. Giả sử rằng một trong các hoạt động không đồng bộ của bạn mất 3 phút để hoàn thành, nếu chúng tôi không có các hoạt động không đồng bộ, giao diện sẽ đóng băng trong 3 phút.
Cách đọc được đề nghị:
Tín dụng ban đầu cho câu trả lời này là: Làm cách nào để trả lại phản hồi từ một cuộc gọi không đồng bộ?
Nhưng với bản phát hành angle2, chúng ta đã được giới thiệu với các tệp có thể quan sát được và có thể quan sát được nên câu trả lời này hy vọng sẽ bao gồm các kiến thức cơ bản về xử lý một yêu cầu không đồng bộ với các tệp quan sát được.