Javascript 的怪异行为
Wiered behaviour by Javascript
我有以下Java脚本代码片段:
function upoload_TC(evt) {
var file = evt.target.files[0];
if(file.type != 'text/plain'){
evt.target.style='color:red;';
}
else{
var app_data='';
reader = new FileReader();
reader.onload = function(){
app_data = reader.result;
};
reader.readAsText(file);
if (evt.target.id[7]=='2') {
/* area of intrest begin: */
var packet_order = get_packet_order(evt.target);
console.log("1st");
var app_data1 = app_data.split('\n');
console.log("app_data: ");
console.log(app_data);
console.log("app_data1: ");
console.log(app_data1);
/* area of intrest end */
for(var i=0; i<app_data1.length; ++i){
console.log("3st");
if(app_data1[i][0] == '!'){
app_data1.splice(i,1);
--i;
console.log(app_data1);
}
console.log(app_data);
...
}
}
}
}
app_data
有一个长字符串。
执行后,有时app_data1
没有记录任何内容。
观察:当我在调试器中一步一步执行时,app_data1
具有预期值。但是如果我的第一个断点在 app_data1
的赋值语句之后,它是空的。
我该如何解决这个问题?
我找到了 call_back
和 promises
来解决用户定义函数的此类问题。由于split()
不是我定义的,我想这些都不行。
我相信 timeout
不是执行此操作的正确方法。是吗?
请查找调试器的视频window here。
试试这个:
var stringSplit = function (str) {
return new Promise(function (resolve, reject) {
var splittedString = str.split('\n');
return resolve(splittedString);
});
}
var veryLongStr = "very long string";
stringSplit(veryLongStr).then(function (splittedString) {
console.log(splittedString);
});
您应该在 onload
回调中进行日志记录/处理。在您的示例代码中,您在 load
事件上设置 app_data
的值,该事件在异步函数 readAsText
完成它的事情后触发。到那时,日志记录/处理代码已经执行。
我有以下Java脚本代码片段:
function upoload_TC(evt) {
var file = evt.target.files[0];
if(file.type != 'text/plain'){
evt.target.style='color:red;';
}
else{
var app_data='';
reader = new FileReader();
reader.onload = function(){
app_data = reader.result;
};
reader.readAsText(file);
if (evt.target.id[7]=='2') {
/* area of intrest begin: */
var packet_order = get_packet_order(evt.target);
console.log("1st");
var app_data1 = app_data.split('\n');
console.log("app_data: ");
console.log(app_data);
console.log("app_data1: ");
console.log(app_data1);
/* area of intrest end */
for(var i=0; i<app_data1.length; ++i){
console.log("3st");
if(app_data1[i][0] == '!'){
app_data1.splice(i,1);
--i;
console.log(app_data1);
}
console.log(app_data);
...
}
}
}
}
app_data
有一个长字符串。
执行后,有时app_data1
没有记录任何内容。
观察:当我在调试器中一步一步执行时,app_data1
具有预期值。但是如果我的第一个断点在 app_data1
的赋值语句之后,它是空的。
我该如何解决这个问题?
我找到了 call_back
和 promises
来解决用户定义函数的此类问题。由于split()
不是我定义的,我想这些都不行。
我相信 timeout
不是执行此操作的正确方法。是吗?
请查找调试器的视频window here。
试试这个:
var stringSplit = function (str) {
return new Promise(function (resolve, reject) {
var splittedString = str.split('\n');
return resolve(splittedString);
});
}
var veryLongStr = "very long string";
stringSplit(veryLongStr).then(function (splittedString) {
console.log(splittedString);
});
您应该在 onload
回调中进行日志记录/处理。在您的示例代码中,您在 load
事件上设置 app_data
的值,该事件在异步函数 readAsText
完成它的事情后触发。到那时,日志记录/处理代码已经执行。