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

Firebase-Angularfire2订阅等待响应返回值,firebase,angularfire2,angular5,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'

我对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;
          });
  }

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

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

因此,您得到的错误是因为您的函数实际上没有返回任何内容,但它被声明为返回一个
字符串
,而您只会在稍后得到该字符串

一种解决方案是将您的功能声明为可观察的,就像您正在使用的数据库服务一样,并异步使用它

例如:

//需要额外导入
从“rxjs”导入{Observable};
createInstance(instanceName:string):可观察{
返回可观察的。创建(观察者=>{
this.databaseService.getList('/Events/'+instanceName).subscribe(结果=>{
如果(result.length==0){
this.databaseService.update('/Events/'+instanceName+'/Configuration',myObject);
observer.next('Instance created');
}否则{
next('实例已存在');
}
observer.complete();
});
});
}
你这样消费它:

createInstance('test')。订阅(消息=>{
//给你
});