使用async.apply时如何保持其值?

时间:2019-07-14 21:27:29

标签: javascript express mongoose mongoose-schema async.js

我正在使用async.parallel一次运行2个函数,这些函数是从猫鼬模型上的静态函数运行的。如您所见,我可以使用此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()时,它说它不是一个函数,看着它似乎表明它是在设置应用程序,而不是模型。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

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

This是async.apply的函数定义,似乎它使用传递的参数调用传递的函数,这就是this被设置为Express应用程序的父范围的原因。

所以基本上发生了什么事

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))

答案 2 :(得分:0)

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

使用箭头功能:

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),
...