Bạn chỉ không thể trả lại giá trị trực tiếp vì đó là cuộc gọi không đồng bộ. Cuộc gọi không đồng bộ có nghĩa là cuộc gọi đang chạy trong nền (thực tế được lên lịch để thực hiện sau) trong khi mã của bạn tiếp tục thực thi.
Bạn cũng không thể trực tiếp có mã như vậy trong lớp học. Nó cần phải được chuyển vào một phương thức hoặc hàm tạo.
gì bạn có thể làm không phải là để subscribe()
trực tiếp nhưng sử dụng một nhà điều hành như map()
export class DataComponent{
someMethod() {
return this.http.get(path).map(res => {
return res.json();
});
}
}
Bên cạnh đó, bạn có thể kết hợp nhiều .map
với quan sát giống như đôi khi điều này cải thiện rõ ràng mã và giữ những điều riêng biệt. Ví dụ:
validateResponse = (response) => validate(response);
parseJson = (json) => JSON.parse(json);
fetchUnits() {
return this.http.get(requestUrl).map(this.validateResponse).map(this.parseJson);
}
Bằng cách này một quan sát được sẽ trả lại người gọi có thể đăng ký để
export class DataComponent{
someMethod() {
return this.http.get(path).map(res => {
return res.json();
});
}
otherMethod() {
this.someMethod().subscribe(data => this.data = data);
}
}
Người gọi cũng có thể ở lớp khác. Ở đây nó chỉ là ngắn gọn.
data => this.data = data
và
res => return res.json()
là mũi tên chức năng. Chúng tương tự như các chức năng bình thường. Các chức năng này được chuyển đến subscribe(...)
hoặc map(...)
để được gọi từ vị trí quan sát được khi dữ liệu đến từ phản hồi. Đây là lý do tại sao dữ liệu không thể được trả lại trực tiếp, bởi vì khi someMethod()
hoàn tất, dữ liệu chưa được nhận.
Nguồn
2016-09-02 15:31:07
Bạn có lỗi đánh máy ở đó, phanh đầu tiên phải nằm sau phần "res =>", như sau: 'res => { return res; } ' – Neyxo
@Neyxo cảm ơn rất nhiều vì gợi ý! –