使用 async.apply 时如何保持 this 的值? [复制]

Posted

技术标签:

【中文标题】使用 async.apply 时如何保持 this 的值? [复制]【英文标题】:How to keep the value of this when using async.apply? [duplicate] 【发布时间】:2019-11-23 15:44:55 【问题描述】:

我正在使用 async.parallel 一次运行 2 个函数,这些函数是从 mongoose 模型上的静态函数运行的。如您所见,我可以通过this 访问模型及其代码中的函数(模型有一个名为 verifyParent 的静态函数):

async.parallel([
      async.apply(content, slug: slug),
      async.apply(this.verifyParent, req.body.reply),
    ], (err, result) => 
          //results
);

但是在 this.verifyParent 函数中,如果我尝试使用this,它等于我的 express 应用程序,而不是猫鼬模型。我相信 async.apply 正在这样做,我不知道如何让它保持它通常具有的 this 值。

在 verifyParent 中,我正在尝试查询 mongodb。当我运行this.findOne() 时,它说它不是一个函数,并且看起来这似乎表明它设置了应用程序,而不是模型。

【问题讨论】:

【参考方案1】:

根据您的问题,this 是模型。

那你应该把代码改成

var model = this;
var verify = function(reply) 
  model.verifyParent(reply);
;
async.parallel([
  async.apply(content, slug: slug),
  async.apply(verify, req.body.reply),
], (err, result) => 
      //results
);

因为this 关键字是基于上下文的。请参阅Function context 了解更多信息。

【讨论】:

对不起,我编辑了你的答案而不是我的。删除了我的编辑。 @nrgwsth 我发现了他的问题,让他自己去探索。我真的难过他授予你的答案。 ;( PS:bind()返回一个函数,为了更好的编码习惯,应该提取到局部变量。(这也是我试图给他看的)【参考方案2】:

您可以像这样将函数绑定到当前上下文,

async.parallel([
      async.apply(content, slug: slug),
      async.apply(this.verifyParent.bind(this), req.body.reply),
    ], (err, result) => 
          //results
);

This 是 async.apply 的函数定义,看起来它使用传递的参数调用传递的函数,这就是为什么 this 被设置为父作用域,即 express app。

所以基本上发生的事情是这样的,

function apply(fn) 
  return fn();


var model = 
  prop: "world",
  verifyParent: function () 
    console.log("hello", this.prop)
  


// model context is lost.
apply(model.verifyParent)

// bind to model explicitly.
apply(model.verifyParent.bind(model))

【讨论】:

【参考方案3】:

这可以通过以下方式完成:

使用箭头函数:

async.parallel([
      async.apply(content, slug: slug),
      async.apply(() => this.verifyParent, req.body.reply),
    ], (err, result) => 
          //results
);

使用硬绑定:

...
function boundedVerifyParent() 
   return this.verifyParent.call(this)

...
async.apply(this.boundedVerifyParent, req.body.reply),
...

或者使用bind方法:

...
async.apply(this.verifyParent.bind(this), req.body.reply),
...

【讨论】:

以上是关于使用 async.apply 时如何保持 this 的值? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

当进程结束时,如何保持QProcess执行的命令?

添加到后台堆栈时如何保持片段状态?

使用jQuery单击时保持图像悬停按钮

php - 如何在刷新后保持图像按钮状态

如何使用保持纵横比的 QHBLayout 调整子 QLabel(具有 QPixmap)的大小?

刷新后如何让用户保持登录到 Firebase 应用程序?