6

我一直在尝试调试奇怪的问题,我终于弄清楚了为什么会发生这种情况。只是不知道如何防止它(;我有这个功能:

getInfo(id) {
  id = id || "zero";
  let i = routeDefinitions.findIndex(r => Boolean(r.name.toLowerCase().match(id)));
  // console.log(i) - works in plunker
  // but in my app sometimes returns -1...
  let current = routeDefinitions[i];
  let next = routeDefinitions[i + 1] ? routeDefinitions[i + 1] : false;
  let prev = routeDefinitions[i - 1] ? routeDefinitions[i - 1] : false;
  return { prev, current, next };
}

..它在这个 plunker中完美运行,但在我的应用程序中,我使用它的返回值来更新应用程序状态(redux 模式的自定义实现)。当我通过这个函数发送返回值时:

  private _update(_old, _new) {
    let newState = Object.keys(_new)
      .map(key => {
        if (_old[key] === undefined) {
          _old[key] = _new[key];
        } else if (typeof _new[key] === "object") {
          this._update(_old[key], _new[key]);
        } else {
          _old[key] = _new[key];
        }
        return _old;
      })
      .find(Boolean);

    return Object.assign({}, newState || _old);
  }

..routeDefinitions数组发生了变异,事情开始破裂了……我尝试了几件事:

let current = [...routeDefinitions][i];
// and:
return Object.assign({}, { prev, current, next });

..但它没有用。如何防止routeDefinitions数组突变?

编辑:我设法重现了这个 plunker中的错误

4

2 回答 2

0

我通过这样修改解决了这个问题_update()

  private _update2(_old, _new) {
    let newState = {}; 
    Object.keys(_new)
      .map(key => {
        if (_old[key] === undefined) {
          newState[key] = _new[key];
        } else if (typeof _new[key] === "object") {
          newState[key] = this._update2(_old[key], _new[key]);
        } else {
          newState[key] = _new[key];
        }
        return newState;
      })
      .find(Boolean);

    return Object.assign({}, _old, newState);
  } 

old state只是用来检查值,在完成之前不要修改它_update()

普朗克

于 2016-01-18T05:10:58.130 回答
0

routeDefinitions 数组发生突变,事情开始中断

如果您的功能确实是:

getInfo(id) {
  id = id || "zero";
  let i = routeDefinitions.findIndex(r => Boolean(r.name.toLowerCase().match(id)));
  // console.log(i) - works in plunker
  // but in my app sometimes returns -1...
  let current = routeDefinitions[i];
  let next = routeDefinitions[i + 1] ? routeDefinitions[i + 1] : false;
  let prev = routeDefinitions[i - 1] ? routeDefinitions[i - 1] : false;
  return { prev, current, next };
}

然后routeDefinitions 是没有变异的。其他东西正在改变 routeDefinitions。

于 2016-01-18T01:49:50.963 回答