【问题标题】:Recursive Function with Callback JS带有回调 JS 的递归函数
【发布时间】:2019-01-19 12:19:40
【问题描述】:

我有这两个递归函数。第一个有效,但是当我尝试将quantityColumn 函数作为callback 到第二个函数时,我收到callback is not a function 的错误。任何想法我做错了什么?

var sumColumn = function(lineNumber) {
    return lineNumber === 0 
        ? quantityColumn(0)
        : quantityColumn(lineNumber) + sumColumn(lineNumber -1)
}

sumColumn(lineCount) // returns 9 

var sumColumn = function(callback, lineNumber) {
    return lineNumber === 0 
        ? callback(0)
        : callback(lineNumber) + sumColumn(callback(lineNumber -1), lineNumber -1)
}
sumColumn(quantityColumn, lineCount) // callback is not a function

如果需要更多代码。这就是quantityColumn 函数的含义。另外值得注意的是,current.getSublistValue 是一个第 3 方 API (NetSuite),它基本上只返回表格中行/行的交点。

 var columnValue = R.curry(function(getSublistValue, sublistId, column, i) {
     return getSublistValue({
         sublistId: sublistId,
         fieldId: column,
         line: i              
      })
   }
)
var itemSublist(current.getSublistValue)('item')
var quantityColumn = itemSublist('quantity')
var lineCount = current.getLineCount('item') - 1 // first index is 0

quantityColumn(5) // 2
quantityColumn(4) // 1
quantityColumn(3) ...

var sumColumn = function(lineNumber) {
    return lineNumber === 0 
        ? quantityColumn(0)
        : quantityColumn(lineNumber) + sumColumn(lineNumber -1)
}
sumColumn(lineCount) // returns 9

【问题讨论】:

  • 如您所见 var sumColumn = function(callback, lineNumber) 期望参数 1 是 `callback` (并且您需要两个参数才能正确调用该函数)。您正在调用该函数 sumColumn(lineCount) 它直接进入 @ 987654330@ (lineCount->callback) , 不是(lineCount->lineNumber)
  • var itemSublist(current.getSublistValue)('item') 是什么意思?
  • 我的例子错了,我确实是这样称呼的。 itemSublist(current.getSublistValue)('item') 只是创建了一个partial application 的函数。它们只是执行第 3 方 API getSublistValue 所必需的值。可能还有其他“子列表”表,这就是为什么像这样对其进行咖喱很有用
  • itemSublist('quantity') 返回function 对吗?和quantityColumn(5) // 2 也可以吗?
  • 请查看我的解决方案

标签: javascript recursion callback functional-programming


【解决方案1】:
var sumColumn = function(lineNumber) {
    return lineNumber === 0 
        ? quantityColumn(0)
        : quantityColumn(lineNumber) + sumColumn(lineNumber -1)
}

sumColumn(lineCount) // returns 9 

var sumColumn = function(callback, lineNumber) {
    return lineNumber === 0 
        ? callback(0)
        : callback(lineNumber) + sumColumn(callback, lineNumber -1)
}
sumColumn(quantityColumn, lineCount) // callback is not a function

在这一行callback(lineNumber) + sumColumn(callback(lineNumber -1), lineNumber -1) 你正在调用函数callback(带有参数lineNumber-1)你想要传递它

【讨论】:

  • 啊,我明白了,我只需要将 callback 本身传递到递归调用中。谢谢@Anandu!我在环境中进行了测试,它确实有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-09
  • 2021-11-24
  • 2020-09-29
相关资源
最近更新 更多