如何防止bind在使用async.series时更改node.js中的原始对象

How to prevent bind from mutating original object in node.js when using async.series?

本文关键字:js node 对象 原始 bind 何防止 series async      更新时间:2023-09-26

我有以下测试代码:

var async = require('async');
var GROUP = 'testGroup';
var opts = {
  someKey: 'hi',
};
test(opts);
function test(options) {
  async.series([
    doThis.bind(null, options),
    doThat.bind(null, options),
  ], function(results) {
    debugger;
  });
}
function doThis(options, cb) {
  options.someKey = [GROUP, options.someKey].join('.');
  return cb();
}
function doThat(options, cb) {
  debugger;
  options.someKey = [GROUP, options.someKey].join('.');
  return cb();
}

当我们在doThat()中达到debugger时,options.someKey已经具有值someGROUP.hi,因此当函数完成时,我们最终得到options.someKey === 'someGROUP.someGroup.hi'

我们如何绑定以使原始对象不变?绑定是必要的,因为我们需要将选项传递给在async.series中运行的函数。否则,我们可以调用函数并将对象作为参数传入。

我不认为将options参数部分应用于doThis()doThat()

您将相同的javascript对象/文字作为参数传递给两个函数,然后对该参数进行变异。

如果你不想改变那个对象,那就不要。找到其他返回操作结果的方法doThis()doThat()可以返回值,而不是修改参数。您可以在调用该系列之后的最后一次回调中收集它们。

如果您只想保留opts的初始值,那么在将其传递到测试之前,请使用lodash或其他方法对opts进行深度克隆。