Firebase - Angularfire2订阅等待响应返回值

标签 firebase angularfire2 angular5

我对 Angularfire2 的异步操作有疑问。我想在 Firebase 数据库中创建一个新资源,但首先我想检查是否存在同名资源并向前端返回一条消息。

问题是我无法将消息返回到 subscribe 方法中。 VS 抛出此错误:

Severity    Code    Description Project File    Line    Suppression State
Error   TS2355  (TS) A function whose declared type is neither 'void' nor 'any' must return a value.

这是我的函数代码:

createInstance(instanceName: string): string {
      this.databaseService.getList('/Events/' + instanceName).subscribe(
          result => {
              var message;
              if (result.length === 0)
              {
                  this.databaseService.update('/Events/' + instanceName + '/Configuration', myObject);
                  message = "Instance created";
              }
              else
              {
                  message = "Instance already exists";
              }
              return message;
          });
  }

最佳答案

您正在运行的函数是异步的,因此您订阅响应以便在操作完成时收到通知。

但是,您的函数是同步运行的,因此它会在数据库获取数据之前执行并返回(稍后会发生)。

所以你得到的错误是因为你的函数实际上没有返回任何东西,但它被声明为返回一个字符串,你只是稍后才得到。

一种解决方案是将您的函数声明为 Observable,就像您正在使用的数据库服务一样,并异步使用它。

例如:

// extra import you'll need
import { Observable } from 'rxjs';

createInstance(instanceName: string): Observable<string> {
    return Observable.create(observer => {
        this.databaseService.getList('/Events/' + instanceName).subscribe(result => {
            if (result.length === 0) {
                this.databaseService.update('/Events/' + instanceName + '/Configuration', myObject);
                observer.next('Instance created');
            } else {
                observer.next('Instance already exists');
            }
            observer.complete();
        });
    });
}

你像这样消费它:

createInstance('test').subscribe(message => {
    // here you go
});

关于Firebase - Angularfire2订阅等待响应返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47756496/

相关文章:

android - 使用自定义适配器将数据从 firebase 数据库检索到多个 TextView 中,不显示任何错误/不显示任何内容?

c# - 为什么使用 Google Cloud Firestore 1.0.0-beta05 C# SetAsync 时会出现 Grpc.Core.RpcException StatusCode=Unavailable, Detail ="Connect Failed"?

android - 如何在聊天应用程序中将 FirebaseRecyclerAdapter 用于两个项目布局

firebase - Firebase 中的多对多关系

javascript - 有没有办法将工作 HTML 页面用作 Angular 5/6 组件?

android - 如何确保只有我的应用能够注册和接收从 FCM 发送的消息?

Firebase/AngularFire2 : Push data not directly, 仅在按下保存按钮后

javascript - Angular Universal,在单击 'refresh' 两次之前应用程序不会加载

javascript - 通过传递数组来添加类

angular - 将 Angular 4.x 迁移到 Angular 5