0

我的代码似乎在 chrome 中带来了某种量子决斗状态,调用了一个宇宙,在这个宇宙中,函数undefined在被推送到数组时会变成......

我正在使用以下代码构建一组函数,以便使用此函数将它们链接在一起https://gist.github.com/3609831

console.log "creating stack"

ids = (id for id of @s3) # an array of integers

stack = [callback]
console.log stack

for ssid of @s3
  new_func =  ((cb) => @idb.load_s3(ssids.shift(),cb))
  console.log new_func
  stack.push new_func
  console.log stack

console.log "stack done"

奇怪的是,尽管它实际上似乎有效;所有带有正确参数的函数调用似乎都在发生,它也在控制台中得到这个(使用我的格式和注释)

> creating stack

# callback added to array correctly
> [function () { return _this.start(true); }]

# function generated correctly
> function (cb) { return _this.idb.load_s3(ssids.shift(), cb); } 

# but the function doesn't get added to the array !!!!!!!
> [function () { return _this.start(true); }, undefined × 1]

> stack done

# and the undefined from the array can't be executed of course, verified my line number
> Uncaught TypeError: undefined is not a function 

这似乎意味着虽然它有效......它也没有工作......因为...... new_func 在被推送到数组时变成未定义......

怎么回事???

有人对这里可能发生的事情有任何线索吗?

我正在使用 chrome v21

...

编辑:仅供参考 @idb.load_s3 函数在范围内,我知道它正在工作,因为它从 indexedDB 加载数据,如果其中任何部分被破坏,则不会加载(并且因为回调确实触发)。

...

EDIT2:这是javascript,没什么不同或奇怪的,只是更难阅读

var id, ids, new_func, ssid, stack,
  _this = this;

console.log("creating stack");

ids = (function() {
  var _results;
  _results = [];
  for (id in this.s3) {
    _results.push(id);
  }
  return _results;
}).call(this);

stack = [callback];

console.log(stack);

for (ssid in this.s3) {
  new_func = (function(cb) {
    return _this.idb.load_s3(ssids.shift(), cb);
  });
  console.log(new_func);
  stack.push(new_func);
  console.log(stack);
}

console.log("stack done");

...

编辑 3:刚刚意识到问题的一部分是因为 Chrome 的控制台可能是异步的,所以似乎最后一项从堆栈中弹出(在此处未显示的代码中)在调用 console.log 之后但在 console.log 实际输出之前数组内容!!!因此,当我不调用函数(参见引用的要点)来执行堆栈时,其余部分似乎工作正常。

然而,这并不能解决抱怨 undefined 不是函数的异常的谜​​团(就像它试图从数组中弹出 undefined 并执行它)......仍然很奇怪!

...

编辑#4:load_s3 函数在这里:https ://github.com/gnatters/neuroanatomist/blob/master/app/assets/jax/models/asset_loader.js.coffee.erb#L118 代码的真实版本是这里质疑的是在 #L145 的 load_everything 的同一个文件中

4

1 回答 1

0

我解决了!这个问题有两个部分看起来是一样的。首先,在编辑 3 中,数组看起来在函数被推送的地方包含一个未定义的项目。然而,这似乎是 chrome 的异步控制台中的一个怪癖(错误?),在 console.log 调用和数组的实际日志记录之间的时间内,该函数被从数组中删除。

问题的第二部分在外观上也具有欺骗性,很抱歉我在提问时认为这不是那么重要。在链接的要点(现已修订)中,该函数试图从数组中弹出并执行一个额外的函数,这当然等于尝试所有未定义的函数。不容易发现...

一切都很好。感谢参与 ;)

于 2012-09-04T23:45:48.113 回答