Angular 如何在承诺的范围内正确使用我的应用程序代码?

Angular 如何在承诺的范围内正确使用我的应用程序代码?,angular,firebase,firebase-realtime-database,promise,Angular,Firebase,Firebase Realtime Database,Promise,我正在开发一个应用程序 网络使用Angular2。我正在使用Firebase实时数据库 对于实体“arbitro”,我实现了两个类: arbitro.component.ts,它管理实体和关联屏幕的逻辑 arbitro.service.ts,它在数据库上执行操作 在服务类中,我实现了以下方法,它在数据库中参数的节点上执行更新,并返回类型为Promise的元素 在component类中(从这里我调用update),我实现了如下所示的方法。调用服务的更新,然后我使用then和catch子句处理返回的

我正在开发一个应用程序 网络使用Angular2。我正在使用Firebase实时数据库

对于实体“arbitro”,我实现了两个类:

arbitro.component.ts,它管理实体和关联屏幕的逻辑

arbitro.service.ts,它在数据库上执行操作

在服务类中,我实现了以下方法,它在数据库中参数的节点上执行更新,并返回类型为Promise的元素

在component类中(从这里我调用update),我实现了如下所示的方法。调用服务的更新,然后我使用then和catch子句处理返回的承诺

  • ArbitroSvc是arbitro.service.ts的一个实例
  • 承诺是组件类的一个属性
  • checkEdited是一个布尔属性,如果Promise抛出一个成功的响应,我想将其赋值为true
当我启动应用程序并执行更新时,我在控制台中得到以下响应:

更新已成功完成

更新失败:TypeError:无法设置未定义的属性“checkEdited”

通过分析输出,我推断更新已成功执行,问题在于将值分配给checkEdited

由此,我对该逻辑的操作和实现有两个问题:

  • 我在组件类中管理更新响应的方法正确吗
  • 如果它是正确的,我得到的关于checkEdited的错误是什么?我如何避免它

谢谢

您遇到的问题是此的绑定。在内部函数中,它引用不同的值

您有三种选择:

  • 使用箭头功能,捕捉周围的
  • 将此
    分配给临时变量(例如
    self
    ):
  • 绑定内部函数:
  • editArbitro(arbitro: Arbitro) {
        return this.items.update(arbitro.id, arbitro);
      }
    
    this.promise = this.arbitroSvc.editArbitro(this.arbitro);
            this.promise.then(function () {
              console.log('Update completed successfully');
              this.checkEdited = true;
            }).catch(function (error) {
              console.log('Update failed: ' + error);
              });
    
    this.promise = this.arbitroSvc.editArbitro(this.arbitro);
    this.promise.then(() => {
        console.log('Update completed successfully');
        this.checkEdited = true;
    }).catch(function (error) {
        console.log('Update failed: ' + error);
    });
    
    let self = this;
    this.promise = this.arbitroSvc.editArbitro(this.arbitro);
    this.promise.then(() => {
        console.log('Update completed successfully');
        self.checkEdited = true;
    }).catch(function (error) {
        console.log('Update failed: ' + error);
    });
    
    this.promise = this.arbitroSvc.editArbitro(this.arbitro);
    this.promise.then(() => {
        console.log('Update completed successfully');
        this.checkEdited = true;
    }.bind(this)).catch(function (error) {
        console.log('Update failed: ' + error);
    });