在MongoDB MapReduce作用域中使用部分应用的函数

我在MongoDB MapReduce操作中使用了一个通用映射函数,其中映射本身是一种元运algorithm则,运行通过scope传递给它的某些函数。 这对正常的JS函数工作正常,但我也想传入部分应用函数,这是我遇到的问题。

我用各种configuration填充mrScope ,包括我需要部分应用的function,如下所示:

 mrScope.operator = operators.getOperator(opSettings.arg1); 

我把(promisified)mapReduce称为:

 conn.mongoClient.collection(input.collection).mapReduceAsync(map, reduce, { query : input.rawQuery, scope : { fScope: mrScope }, jsMode : true, out : 'testMe' }) 

getOperator应该返回一个部分应用的函数。 该函数的最后一个参数总是在map传递,如下所示:

 fScope.operator.call(null, operatorInput); 

在这一点上,我可以从MongoDB得到各种错误,这取决于我如何尝试在getOperator创build部分应用程序。 这里的相关部分是(为了清楚起见,它有打字稿typedef):

 export function getOperator(arg: number): OperatorFunction { if (arg === 0) { throw 'arg must not be 0'; } else { return op.bind(null, arg); } } function op(arg: number, values: number[]): number { var result = 0; // do something return result; } 

如果我使用这样的本地bind() ,MongoDB会抛出这个错误:

 { [MongoError: exception: Error: 16722 SyntaxError: Unexpected identifier at fuzzyMap (_funcs9:4:26) at fuzzyMap (_funcs9:4:26) near 'e.operator); function computeTa' (line 4)] cause: { [MongoError: exception: Error: 16722 SyntaxError: Unexpected identifier at fuzzyMap (_funcs9:4:26) at fuzzyMap (_funcs9:4:26) near 'e.operator); function computeTa' (line 4)] name: 'MongoError', errmsg: 'exception: Error: 16722 SyntaxError: Unexpected identifier\n at fuzzyMap (_funcs9:4:26)\n at fuzzyMap (_funcs9:4:26) near \'e.operator);\r function computeTa\' (line 4)', code: 16722, ok: 0 }, isOperational: true, errmsg: 'exception: Error: 16722 SyntaxError: Unexpected identifier\n at fuzzyMap (_funcs9:4:26)\n at fuzzyMap (_funcs9:4:26) near \'e.operator);\r function computeTa\' (line 4)', code: 16722, ok: 0 } 

我不知道这个错误。 我可以调用MapReduce之外的绑定函数没问题。 我想它必须做一些bind作为本地代码function,但不知道。

如果我使用这样一个简单的非本地绑定(对于修改后的op ):

 function partial(fn: Function, ...others: any[]) { var slice = Array.prototype.slice; var args = slice.call(arguments, 1); return function() { return fn.apply(this, args.concat(slice.call(arguments, 0))); }; } 

并在getOperator

 return partial(op, arg); 

在这种情况下,它没有实际的参考,所以错误是可以理解的。

现在我明白,我可以很容易地做到这一点,没有部分的应用程序,只是直接传递,但我觉得这个方法优雅,我很好奇,如果可以做,如果是的话,你会怎么做?