gpt4 book ai didi

javascript - Chrome 应用程序 : Cannot retrieve file load status

转载 作者:行者123 更新时间:2023-12-03 10:48:19 24 4
gpt4 key购买 nike

我的 Chrome 应用有一个函数,要求另一个函数加载文件,检查该函数是否设置了表示成功的标志 (External.curFile.lodd),然后尝试处理它。我的问题是,第一次调用该函数时未设置标志,但当我第二次调用该函数时,标志已设置。

我有一种感觉,这与 Chrome 文件函数是异步的有关,所以我让第一个函数在文件加载时空闲了一会儿。无论我等多久,第一次加载永远不会成功,但第二次加载总是成功!

调用函数:

function load_by_lines_from_cur_dir( fileName, context ){ // determine the 'meaning' of a file line by line, return last 'meaning', otherwise 'null' 

var curLineMeaning = null;
var lastLineValid = true;

External.read_file_in_load_path(fileName); // 'External' load 'fileName' and reads lines, REPLacement does not see this file

// This is a dirty workaround that accounts for the fact that 'DirectoryEntry.getFile' is asynchronous, thus pre-parsing checks fail intil loaded
var counter = 0, maxLoops = 10;
nuClock();
do{
sleep(500);
counter++;
preDebug.innerText += '\r\nLoop:' + counter + " , " + time_since_last();

}while( !External.curFile.lodd && (counter < maxLoops) ); //idle and check if file loaded, 5000ms max

preDebug.innerText += '\r\nLoaded?:' + External.curFile.lodd;
preDebug.innerText += '\r\nLines?:' + External.curFile.lins;

if( External.curFile.lodd ){ // The last load operating was successful, attempt to parse and interpret each line
// parse and interpret lines, storing each meaning in 'curLineMeaning', until last line is reached
while(!External.curFile.rEOF){
curLineMeaning = meaning( s( External.readln_from_current_file() ), context);
preDebug.innerText += '\r\nNext Line?: ' + External.curFile.lnnm;
preDebug.innerText += '\r\nEOF?: ' + External.curFile.rEOF;
}
} // else, return 'null'
return curLineMeaning; // return the result of the last form
}

调用以下内容:

External.read_file_in_load_path = function(nameStr){ // Read the lines of 'nameStr' into 'External.curFile.lins'
External.curPath.objt.getFile( // call 'DirectoryEntry.getFile' to fetch a file in that directory
nameStr,
{create: false},
function(fileEntry){ // action to perform on the fetched file, success
External.curFile.name = nameStr; // store the file name for later use
External.curFile.objt = fileEntry; // store the 'FileEntry' for later use

External.curFile.objt.file( function(file){ // Returns 'File' object associated with selected file. Use this to read the file's content.
var reader = new FileReader();
reader.onload = function(e){
External.curFile.lodd = true; // File load success
};
reader.onloadend = function(e){
//var contents = e.target.result;
// URL, split string into lines: http://stackoverflow.com/questions/12371970/read-text-file-using-filereader
External.curFile.lins = e.target.result.split('\n'); // split the string result into individual lines
};
reader.readAsText(file);
External.curFile.lnnm = 0; // Set current line to 0 for the newly-loaded file
External.curFile.rEOF = false; // Reset EOF flag
// let's try a message instead of a flag ...
/*chrome.runtime.sendMessage({greeting: "hello"}, function(response) {
console.log(response.farewell);
});*/
} );
},
function(e){ External.curFile.lodd = false; } // There was an error
);
};

这个应用程序是Scheme的一种方言。应用程序知道源文件是否已加载非常重要。

最佳答案

我没有通读您的所有代码,但您不能启动异步事件,然后忙等待它完成,因为 JavaScript 是单线程的。无论发生什么情况,在脚本完成当前处理之前,异步函数都不会执行。换句话说,异步并不意味着并发。

一般来说,如果要在异步任务 B 完成后执行任务 A,则应该从 B 的完成回调中执行 A。这是最简单、安全的方法。任何为了实现更好的响应能力或简化代码的捷径都会存在依赖性或竞争条件问题,并且需要大量的努力才能正确。即便如此,也很难证明代码在所有情况下在所有平台上都能正确运行。

关于javascript - Chrome 应用程序 : Cannot retrieve file load status,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28485231/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com