Lý do:
Lý do mà nó undefined
là bạn đang làm cho một hoạt động không đồng bộ. Có nghĩa là sẽ mất một chút thời gian để hoàn thành phương thức getEventList
(tùy thuộc vào tốc độ mạng của bạn).
Vì vậy, hãy xem cuộc gọi http.
this.es.getEventList()
Sau khi bạn thực sự làm ("lửa") theo yêu cầu của bạn với http subscribe
bạn sẽ có chờ cho các phản ứng. Trong khi chờ đợi, javascript sẽ thực hiện các dòng bên dưới mã này và nếu nó gặp các phép/phép toán đồng bộ, nó sẽ thực thi chúng ngay lập tức.
Vì vậy, sau khi đăng ký vào các getEventList()
và chờ đợi câu trả lờ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 kỳ thứ gì bạn đã khởi tạo nó ngay từ đầu).
Nó tương tự như thực hiện:
ngOnInit(){
setTimeout(()=>{
this.myEvents = response;
}, 5000);
console.log(this.myEvents); //This prints undefined!
}
Giải pháp:
Vì vậy, làm thế nào để chúng tôi khắc phục vấn đề này? Chúng tôi sẽ sử dụng chức năng gọi lại là phương pháp subscribe
. Bởi vì khi dữ liệu đến từ máy chủ, nó sẽ nằm trong số subscribe
với phản hồi.
Vì vậy, thay đổi mã để:
this.es.getEventList()
.subscribe((response)=>{
this.myEvents = response;
console.log(this.myEvents); //<-- not undefined anymore
});
sẽ in câu trả lời .. sau một thời gian.
Bạn nên làm gì:
Có thể có rất nhiều thứ để làm với trả lời của bạn khác hơn là chỉ đăng nó; bạn nên thực hiện tất cả các hoạt động này bên trong hàm gọi lại (bên trong hàm subscribe
), khi dữ liệu đến.
Một điều nữa cần lưu ý là nếu bạn đến từ nền Promise
, cuộc gọi lại then
tương ứng với subscribe
có thể quan sát được.
gì bạn không nên làm:
Bạn không nên cố gắng thay đổi một hoạt động async đến một hoạt động đồng bộ hóa (không phải là bạn có thể). Một trong những lý do khiến chúng tôi có các hoạt động không đồng bộ là không làm cho người dùng chờ một thao tác hoàn tất trong khi họ có thể thực hiện 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.
Reading đề nghị:
Tín dụng gốc để câu trả lời này đi tới: How do I return the response from an asynchronous call?
Nhưng với việc phát hành angular2 chúng tôi đã giới thiệu với nguyên cảo và quan sát nên câu trả lời này hy vọng bao gồm những điều cơ bản của xử lý một yêu cầu không đồng bộ với các quan sát.
đó sẽ là một điểm tốt để nhấn mạnh trên thực tế nó không phải là có thể chuyển đổi một hoạt động không đồng bộ với một synchrnous-one. – n00dl3
@ n00dl3 Cảm ơn mẹo! Tôi đã cố gắng giải thích trong phần "Những gì bạn không nên làm:". Vui lòng chỉnh sửa nó. – echonax