使用async.series时如何防止bind.js中的原始对象发生变异?

时间:2016-04-29 01:44:50

标签: javascript node.js bind node-async

我有以下测试代码:

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();
}

当我们点击debugger中的doThat()时,options.someKey已经有someGROUP.hi的值,所以当函数完成后我们最终得到options.someKey === 'someGROUP.someGroup.hi'

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

1 个答案:

答案 0 :(得分:0)

我不认为您将选项参数部分应用于 doThis() doThat()< / em> 功能特别相关。

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

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

如果您只想保留opts的初始值,请在将opts传递给测试之前使用lodash或其他东西进行opts的深层克隆。