【问题标题】:How to change a promise with async await function to observable?如何将带有异步等待功能的承诺更改为可观察的?
【发布时间】:2019-02-20 14:45:48
【问题描述】:

我有一个带有控制器和服务的 Nestjs 休息服务器。

在我的控制器中,有 get 函数,当有人发出 get 请求时:

@Get()
getAllFoos() {
    return this.fooService.getAllFoos();
}

在我的服务中,有这个功能可以从数据库中获取文档

 async getAllFoos(): Promise<foos[]> {
    try {
        return await this.fooModel.find().exec();
    } catch(e) {
        return e;
    }

这行得通! 我现在需要更改它以使其与可观察对象一起使用。 我将控制器更改为:

@Get()
getAllFoos() {
    this.fooService.getAllFoos().subscribe(
        response => {
            console.log(response);

        },
        error => {
            console.log(error);
        },
        () => {
            console.log('completed');

    });
}

对此的服务:

    getAllFoos(): Observable<foos[]> {
        try {
            this.fooModel.find().exec();
        } catch(e) {
            return e;
        }
    }

我得到的错误是

[Nest] 7120   - 2019-2-20 15:29:51   [ExceptionsHandler] Cannot read property 'subscribe' of undefined +4126ms

错误来自

this.fooService.getAllFoos().subscribe(

来自控制器的这条线。我真的不知道要改变什么才能让它现在工作。

感谢任何帮助或想法!

【问题讨论】:

  • 在 try{} 里面的服务中你不需要类似于你的 catch{} 的 return 语句吗..
  • 我试过了。我的 IDE 将这条线标记为红色,然后显示以下消息:“Type 'Promise' is missing the following properties from type 'Observable': _isScalar, soure, operator, lift and 6 more.
  • 我不知道为什么它仍然期待一个承诺?!
  • 不使用 observable 怎么办,如下所示stackoverflow.com/a/54770820/10634638

标签: javascript typescript observable es6-promise nestjs


【解决方案1】:

Promise 不能被转换为 Observable。使用 Observable.from() 方法 (docs) 创建一个 observable。

getAllFoos(): Observable<foos[]> {
    return Observable.from(this.fooModel.find().exec());
}

rxjs 版本

getAllFoos(): Observable<foos[]> {
    return Observable.fromPromise(this.fooModel.find().exec());
}

【讨论】:

    猜你喜欢
    • 2019-07-27
    • 1970-01-01
    • 1970-01-01
    • 2019-05-05
    • 2021-05-17
    • 1970-01-01
    • 2017-06-15
    • 1970-01-01
    • 2020-03-26
    相关资源
    最近更新 更多