javascript - Angular 2. 在 Promise 中丢失 this 的范围

标签 javascript angular promise

我觉得我在这里遗漏了一些东西。我有一项服务可以获取一些数据。我将其转换为 promise ,然后尝试以单独的方法处理数据。

一旦它命中方法,我就失去了访问我通常从 this.whatever 访问的对象的能力。如果我将 addJobsToTree 中的所有代码留在 then block 中,它就可以正常工作。我还可以从组件中的任何其他地方访问它。我确定我正在做一些愚蠢的事情,但无法弄清楚。

ngOnInit(){
    this._scheduleDataService.getSavedScheduleData(this.buildDateStringFromCalendar(),1004)
        .toPromise()
        .then(this.addToJobsTree);
}
private addToJobsTree(res){
    for(let xx of res){
        this._sharedService.jobs.push(xx); //Comes back as cannot read _sharedService of null
        console.log(this._sharedService.jobs);
    }
}

最佳答案

这是因为你引用了一个函数而你失去了函数的上下文。要解决此问题,您需要将函数显式链接到对象。

您可以使用 bind 方法:

ngOnInit(){
this._scheduleDataService.getSavedScheduleData(this.buildDateStringFromCalendar(),1004)
      .toPromise()
      .then(this.addToJobsTree.bind(this); // <-----
}

(注意:这是在 TypeScript 中使用 bind 方法的缺点:https://basarat.gitbooks.io/typescript/content/docs/tips/bind.html )

或者一个箭头函数来解决这个问题:

ngOnInit(){
this._scheduleDataService.getSavedScheduleData(this.buildDateStringFromCalendar(),1004)
      .toPromise()
      .then((data) => { // <-----
        this.addToJobsTree(data);
      });
}

关于javascript - Angular 2. 在 Promise 中丢失 this 的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38818006/

相关文章:

javascript - 使用 gettext 翻译 .js 文件

javascript - 如何在 javascript 中保存和恢复选择范围?

angular - 如何从 Web api Angular 6 获取数据

AngularJS 2 a Promise resolve 在 feching 时丢失类标识

javascript - 有没有更干净的方式来链接这些 Bluebird promise ?

javascript - 在winforms webbrowser控件中调用href点击事件JavaScript

javascript - zClip 不起作用 - 多次复制到剪贴板 JS

Angular 国际化 ( ngx-translate/i18n OR i18next )

angular - 使用 angular 2 样式绑定(bind)绑定(bind) rgb 颜色值

javascript - 即使我在所有 then-ables 中使用拒绝回调,我最后是否总是需要 catch() ?