0

我的javascript(技术上打字稿)代码中有以下几行:

debug.print("send ajax call : "+file);
jQuery.get('img/' + file + '.txt', this.ProcessFileData.bind(this)); // 'bind' should force the callback to remember its object - part of ECMAScript 5
debug.print("ajax call sent : " + file);

(调试功能是我自己的,它只是写入窗口中的文本框,但它让我看到 Chrome 到目前为止还没有崩溃。)但是在 Chrome 中永远不会到达 ProcessFileData() 开头的调试行(版本 27.0.1453.110),即使它在 IE、Firefox 和 Safari 中运行良好。Chrome 没有出现错误窗口,但选项卡变得无响应 - 我无法调出开发人员工具,或选择页面上的文本等(尽管我可以切换到其他选项卡)。更重要的是,之前版本的代码在 ProcessFileData 函数中存在一些差异,但显然在调试消息所在的位置之后,在 Chrome 中也可以正常工作。

用以下任一替换中间线:

jQuery.get('img/' + file + '.txt', this.ProcessFileData);
jQuery.get('img/' + file + '.txt', function () { debug.print("check"); });

阻止 Chrome 崩溃(尽管这意味着程序的其余部分停止按预期工作),所以它似乎一定是导致问题的“绑定”方法 - 即使这已经成为我项目的一部分 6 个月(我不能没有它就无法让回调正常工作),这个问题仅在几周前出现。我正在使用 ddr-ecma5 库与旧版浏览器兼容,但我尝试将其删除但没有任何效果。

有谁知道回调中的绑定方法如何导致崩溃,以及我如何解决这个问题?有什么方法可以避免使用 bind 方法(它解决了问题)并且仍然让 ProcessFileData 函数知道正在返回哪个文件?

4

1 回答 1

0

我完全不知道为什么你的调用会失败——听起来你的代码中某处有一个无限循环。

为避免使用bind,请将外部保存this在其他变量中并ProcessFileData在匿名函数中调用:

var that = this;
jQuery.get('img/' + file + '.txt', function(e) {
    that.ProcessFileData(e);
});
于 2013-06-06T18:29:31.380 回答