当前位置: 首页 > 面试题库 >

为什么在使用诺言时在类方法中未定义“ this”?

闻人凯泽
2023-03-14
问题内容

我有一个javascript类,每个方法都返回一个QPromise。我想知道为什么thismethod2和中未定义method3。有没有更正确的方法来编写此代码?

function MyClass(opts){
  this.options = opts;

  return this.method1()
    .then(this.method2)
    .then(this.method3);
}

MyClass.prototype.method1 = function(){
  // ...q stuff...

  console.log(this.options); // logs "opts" object

  return deferred.promise;
};

MyClass.prototype.method2 = function(method1resolve){
  // ...q stuff...

  console.log(this); // logs undefined

  return deferred.promise;
};

MyClass.prototype.method3 = function(method2resolve){
  // ...q stuff...

  console.log(this); // logs undefined

  return deferred.promise;
};

我可以使用bind以下方法解决此问题:

function MyClass(opts){
  this.options = opts;

  return this.method1()
    .then(this.method2.bind(this))
    .then(this.method3.bind(this));
}

但是不能完全确定为什么bind有必要。正在.then()消灭this


问题答案:

this始终是调用方法的对象。但是,将方法传递给时then(),您不会调用它!该方法将存储在某个地方,稍后再从那里调用。如果要保存this,则必须这样做:

.then(() => this.method2())

或者,如果您必须在ES6 this之前的版本中进行操作,则需要先保存以下内容:

var that = this;
// ...
.then(function() { that.method2() })


 类似资料:
  • 问题内容: 我有一个javascript类,每个方法都返回一个Promise。我想知道为什么在和中未定义。有没有更正确的方法来编写此代码? 我可以使用以下方法解决此问题: 但是不能完全确定为什么有必要。正在消灭? 问题答案: 始终是调用方法的对象。但是,将方法传递给时,您不会调用它!该方法将存储在某个位置,稍后再从那里调用。如果要保存,则必须这样做: 或者,如果您必须在ES6之前的版本中执行此操作

  • 问题内容: 我试图制作一个延迟X毫秒执行异步函数的函数。 为了演示的目的,以下是异步函数,该函数采用URL: 目的 我在这里的目标是要有一个函数,它将接受X 的参数,然后每隔X ms调用一次,直到不再有其他参数为止。 基本上,我希望每次调用都用X ms分隔。 例如,假设我连续打电话20次。通常,这20个呼叫将立即进行。我想要的是确保20个呼叫之间都存在Xms的延迟。 暂定 解决这个问题的想法是建立

  • 问题内容: 在严格模式下使用javascript时,为什么在匿名函数中未定义此函数?我知道为什么这样做可能有意义,但是我找不到任何具体答案。 例: 问题答案: 这是因为,在ECMAscript 262第5版之前,如果使用的人忘记使用该关键字,那会造成很大的混乱。如果在ES3中调用构造函数时忘了使用,请引用全局对象(在浏览器中),然后用变量破坏全局对象。 这是可怕的行为等人在ECMA决定,只是为了集

  • 问题内容: 例: 我发现上面的代码在Java中是完全合法的。我有以下问题。 在方法内部拥有类定义的用途是什么? 是否会为生成一个类文件 我很难以面向对象的方式来想象这个概念。在行为中具有类定义。也许有人可以用等效的真实例子告诉我。 方法中的抽象类对我来说听起来有点疯狂。但不允许使用任何接口。这背后有什么原因吗? 问题答案: 这称为本地课程。 2很简单:是的,将生成一个类文件。 1和3是同一个问题。

  • 我在ngOnInit方法中初始化一个库,如下所示: 然后我在ngOnInit内部从该实例调用此方法: 所以它的方法最终看起来像这样: 但是我不明白为什么console.log打印的结果是未定义的,如果实际上是这样的话。调用console.log的$grid。 我需要在该方法中再次使用该实例来执行以下操作: 但我不能,因为在这个方法中,$grid是未定义的,这对我来说毫无意义。 有什么想法吗?

  • 问题内容: 我试图了解如何开发独立的Javascript代码。我想用命令行运行测试和模块编写Javscript代码。所以,我已经安装,并伴随着图书馆,和。 我的目录结构如下所示: 我在用下面的代码编写的一个小模块在哪里: 并且是测试: 然后,我尝试从顶级目录运行(因此看到该目录): 所以我的问题是: 这是构造代码的正确方法吗? 为什么我的测试无法运行? 学习这种东西的最好方法是什么?我很难在Goo