0

我有以下 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_backpromises解决用户定义函数的此类问题。由于split()不是我定义的,我认为这些行不通。
我认为timeout这不是正确的方法。是吗?

请在此处找到调试器窗口的视频。

4

2 回答 2

1

您应该在onload回调中进行日志记录/处理。在您的示例代码中,您正在为事件设置值,app_dataload事件在异步函数readAsText完成其操作后触发。到那时,日志记录/处理代码已经被执行。

于 2016-12-07T20:04:12.763 回答
0

试试这个:

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);
});
于 2016-12-03T03:50:20.440 回答