2017-01-11 34 views
5

Tôi đang cố gắng trả lại một quan sát sau khi hoàn tất thành công Lời hứa của tôi, nhưng chức năng đó không trả lại được. Để cụ thể cho mã, tôi muốn tìm nạp mã thông báo auth từ bộ nhớ (trả về lời hứa) và sau khi dữ liệu đó được tìm nạp, sau đó tạo một yêu cầu Post tới Api (trả về Observable). Bằng cách làm như vậy, văn bản tuyệt vời cho một lỗi về chức năng rằng "một hàm mà kiểu tuyên bố không phải là 'khoảng trống' cũng không 'bất kỳ' phải trả lại một giá trị" dưới đây là mã của tôi,Làm cách nào để trả lại Quan sát sau khi một số Lời hứa được giải quyết trong Ionic 2/Angular 2?

logout() : Observable<any>{ 
    this.userData.getAuthToken().then((token)=>{ 
    this.token = token; 
    this.headers = new Headers ({ 
     "X-USER-TOKEN": token 
    }); 
    this.options = new RequestOptions ({ 
     headers: this.headers 
    }); 
    var logout_url = "Api logout method"; 
    return this.http.post(logout_url,{},this.options) 
     .map (res => res.json()) 
    }); 
} 

nếu tôi chỉ đơn giản làm một yêu cầu đăng sau đó nó sẽ trả về mức phạt như thế này

return this.http.post(logout_url,{},this.options) 
    .map (res => res.json()) 

nhưng khi tôi cố gắng lấy dữ liệu, nó không trả về giá trị từ yêu cầu đăng bài này. Bất kỳ trợ giúp nào sẽ được đánh giá cao! Cảm ơn trước

Trả lời

15

Sử dụng fromPromise để chuyển đổi lời hứa thành một quan sát và sử dụng mergeMap để phát ra các phản ứng HTTP vào quan sát bao gồm:

import { Observable } from 'rxjs/Observable/'; 
import 'rxjs/add/observable/fromPromise'; 
import 'rxjs/add/operator/map'; 
import 'rxjs/add/operator/mergeMap'; 

logout(): Observable<any>{ 
    return Observable.fromPromise(this.userData.getAuthToken()).mergeMap(token => { 
    this.token = token; 
    this.headers = new Headers({ 
     "X-USER-TOKEN": token 
    }); 
    this.options = new RequestOptions({ 
     headers: this.headers 
    }); 
    var logout_url = "Api logout method"; 
    return this.http.post(logout_url, {}, this.options).map(res => res.json()); 
    }); 
} 
+0

giải pháp này có vẻ tốt nhưng nó cung cấp cho một lỗi nói _TypeError: Observable_2.fromPromise không phải là một function._ Mặc dù tôi đăng phiên bản ngắn tay của chức năng của tôi trong câu hỏi. Chức năng sau khi cập nhật với fromPromise và mergeMap được đăng ở trên. Plz có một cái nhìn hiện nó trông tốt? –

+0

Đã thêm các mục nhập cần thiết vào câu trả lời. – cartant

+0

mà nhập khẩu đã làm các trick –

1

Bạn sẽ trả lại Promise (nếu bạn không bỏ lỡ phần return trước mặt), điều này sẽ trả lại thành công Observable. Hãy cân nhắc chỉ sử dụng Observables, thay vì trộn cả hai.

Bạn cũng có thể rút gọn thành một mới Observable: new Observable(observer =>
https://angular-2-training-book.rangle.io/handout/observables/using_observables.html

+1

Lời hứa sẽ trả về một sự quan sát, đúng .. Nhưng 'đăng xuất' không trả lại bất cứ điều gì .. –

+0

@suraj đúng, điểm tốt – zurfyx

+0

có, lưu trữ ionic 2 trả về lời hứa về việc thu hồi dữ liệu thành công từ bộ nhớ và sau đó trả về 2 phương thức trả về của phương thức http post. điều chính là làm thế nào tôi có thể trực tiếp trả lại một cái gì đó từ bên trong lời hứa thành công? Mặc dù bạn có thể plz chia sẻ đoạn mã của chuyển đổi để quan sát chỉ? nó có thể giúp giải quyết vấn đề. –

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