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

时间:2017-12-11 15:48:17

标签: 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;
          });
  }

1 个答案:

答案 0 :(得分:2)

您正在运行的功能是异步的,因此您subscribe响应,以便在操作完成时获得通知。

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

所以你得到的错误是因为你的函数实际上没有返回任何东西,但是它被声明为返回string,你只能及时得到它。

一种解决方案是将您的功能声明为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
});
相关问题