承诺链接,“这个”是未定义的

时间:2017-10-25 09:35:40

标签: javascript angular ionic-framework ionic2 angular-promise

在我的提供者中,我有以下代码(简化):

  initiateAPI(): Promise<any> {
      return this.method1()
        .then(this.method1)
        .then(this.method2)
        .catch(console.log);
  }

method1 method2 方法都返回一个Promise,如下所示:

  method1() : Promise<any> {
    console.log("this in method 1",this);
    return new Promise((resolve, reject) => {
      this.anotherProvider.getData().then((data) => {
        if(!data) {
          reject("Data not found");
        }
        resolve(data);
      });
    });
  }

 method2() : Promise<any> {
    console.log("this in method 2",this);
    return new Promise((resolve, reject) => {
      this.thirdProvider.getData().then((data) => {
        if(!data) {
          reject("Data not found");
        }
        resolve(data);
      });
    });
  }

第一种方法( method1 )正确执行,并按预期调用第二种方法( method2 )。问题是第二种方法中this未定义。

我还尝试将承诺链接如下:

  initiateAPI(): Promise<any> {
      return this.method1()
        .then(() => this.method1)
        .then(() => this.method2)
        .catch(console.log);
  }

但问题仍然存在。

如何让this保持其价值?

1 个答案:

答案 0 :(得分:2)

方法是作为老式的function函数实现的,因此不是箭头函数,这意味着this由调用方法的方式决定。当您提供函数引用作为then回调时,this将为undefined(或以草率模式的全局对象)。

至少有两种方法可以保留this

initiateAPI(): Promise<any> {
    return this.method1()
        .then(_ => this.method1())
        .then(_ => this.method2())
        .catch(console.log);
}

或:

initiateAPI(): Promise<any> {
    return this.method1()
        .then(this.method1.bind(this))
        .then(this.method2.bind(this))
        .catch(console.log);
}