我的代码似乎在 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 的同一个文件中