您如何使用Lodash / FP中的“流程”来传递“ this”

时间:2019-11-18 14:55:11

标签: javascript node.js functional-programming lodash

我试图了解如何使用Lodash的“流程”,特别是我想了解如何利用它将原始调用者的“ this”传递给链中每个函数的事实。我碰到了这个帖子– enter image description here –在第二个答案中,它解决了这个问题(“在需要的情况下,所有应用函数都将使用调用者的this参数”),但我不太了解那意味着什么。我试图自己编写一个简短的代码示例,但是它不起作用,可能是因为我错过了练习的重点。任何指针都很感激。

const fp = require('lodash/fp')


const a = x => {
    console.log(`in a this is ${JSON.stringify(this)}`)
    return x * 2
}


const b = x => {
    console.log(`in b this is ${JSON.stringify(this)}`)
    return x / 3
}
const c = x => {
    console.log(`in c this is ${JSON.stringify(this)}`)
    return x + 5
}

const obj1 = {
    a,
    title: "hi there, the title"
}

const all = fp.pipe([obj1.a, b, c])

console.log(all(10))

1 个答案:

答案 0 :(得分:2)

您可以_.bind() this的功能通过管道/流到对象而创建。调用时,将使用绑定的this值调用管道中的所有函数:

const { pipe, bind } = _

function a(x) {
  console.log(`in a this is ${JSON.stringify(this)}`)
  return x * 2
}


function b(x) {
  console.log(`in b this is ${JSON.stringify(this)}`)
  return x / 3
}

function c(x) {
  console.log(`in c this is ${JSON.stringify(this)}`)
  return x + 5
}

const obj1 = {
  title: "hi there, the title"
}

const all = bind(pipe([a, b, c]), obj1)

console.log(all(10))
<script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>

旧答案:您需要将功能手动绑定到obj1。为此,您不能使用数组函数,因为它们会自动使用它们在其中定义的上下文的this

const { pipe, bind } = _

function a(x) {
  console.log(`in a this is ${JSON.stringify(this)}`)
  return x * 2
}


function b(x) {
  console.log(`in b this is ${JSON.stringify(this)}`)
  return x / 3
}

function c(x) {
  console.log(`in c this is ${JSON.stringify(this)}`)
  return x + 5
}

const obj1 = {
  title: "hi there, the title"
}

const all = pipe([a, b, c].map(fn => bind(fn, obj1)))

console.log(all(10))
<script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>