在promise解析器中使用“this”类上下文

时间:2018-04-02 16:33:41

标签: javascript ecmascript-6 es6-promise

是否可以将当前上下文(this)传递给Promise解析器?它似乎在解析器内擦除。

示例:

class A {
  constructor(someObject) {
    this.someObject = someObject;
  }

  foo() {
    return new Promise((resolve) => {
      this.someObject.doAsyncRequest(arg, function(val) { resolve(val); });
    });
  }
}

编辑:

错误将是: “无法读取某些未定义的对象”

EDIT2: 抱歉,这确实有效。我在webpack中有一个错误,它在服务之前将一些随机垃圾插入文件中。

1 个答案:

答案 0 :(得分:3)

这是一个更精简的版本,你的工作正常:



class A {
  constructor() {
    this.a = "hello";
  }
  
  foo() {
     return new Promise(resolve => resolve(this.a));
  }
}

const a = new A();
a.foo().then(a => console.log(a));




由于您在Promise内使用了箭头功能,因此会保留this上下文。

现在,如果您使用普通函数,则会丢失this,因为它将变为未定义(请检查浏览器控制台,因为它会抛出错误而不显示):



class A {
  constructor() {
    this.a = "hello";
  }
  
  foo() {
     return new Promise(function(resolve) { resolve(this.a) });
  }
}

const a = new A();
a.foo().then(a => console.log(a));




如果你想用它维护上下文,你需要绑定它:



class A {
  constructor() {
    this.a = "hello";
  }
  
  foo() {
     return new Promise((function(resolve) { resolve(this.a) }).bind(this));
  }
}

const a = new A();
a.foo().then(a => console.log(a));




如果您使用foo()作为回调,那也会丢失上下文(再次检查浏览器控制台,因为它会抛出错误):



class A {
  constructor() {
    this.a = "hello";
  }
  
  foo() {
     return new Promise(resolve => resolve(this.a));
  }
}

const a = new A();
const callback = a.foo;

callback().then(a => console.log(a));




要解决此问题,请在将其用作回调之前将其绑定:



class A {
  constructor() {
    this.a = "hello";
  }
  
  foo() {
     return new Promise(resolve => resolve(this.a));
  }
}

const a = new A();
const callback = a.foo.bind(a);
callback().then(a => console.log(a));