Javascript 的并发问题 - 我需要一种方法来检查文件加载是否已完成

发布于 2024-11-28 10:41:14 字数 718 浏览 0 评论 0原文

stackoverflow 用户和读者大家好, 我正在用 JS 为 Firefox/Gecko 2.x 编写一个非常简单的东西,但遇到了一个离我的知识有点远的问题。 问题是:我使用以下代码将文件的内容读取为字符串:

NetUtil.asyncFetch(my_file, function(inputStream, status) {
                    if (!Components.isSuccessCode(status)) {
                        return;
                    }
my_string = NetUtil.readInputStreamToString(inputStream, inputStream.available());
]);

读取文件后,我立即评估以下条件:

if (my_string.length == 0) {
    //do something...
} else {
    //do something else...
}

好的,所以问题是,尽管文件中有一些字符,但如果它是第一次运行脚本时,它总是会进入第一个条件,因为它没有足够的时间来读取文件并将字符加载到字符串中。在第二次运行时,全局变量 my_string 具有先前获取的值,因此它将进入“else”条件。 问题是:如何在 JavaScript 中监听“文件完成加载”事件来防止这种行为? 非常感谢。

Hello stackoverflow users and readers,
I am programming a quite easy thing with JS for Firefox/Gecko 2.x and have reached a problem that is a little far away from my knowledge.
The thing is: I read a the content of a file to a string using the following code:

NetUtil.asyncFetch(my_file, function(inputStream, status) {
                    if (!Components.isSuccessCode(status)) {
                        return;
                    }
my_string = NetUtil.readInputStreamToString(inputStream, inputStream.available());
]);

And right after reading the file I evaluate the following condition:

if (my_string.length == 0) {
    //do something...
} else {
    //do something else...
}

OK, so the problem is, although there are some characters in the file, if it's the first run of the script, it will always go to the first condition because it hasn't got time enough to read the file and load the characters into the string. On a second run, the global variable my_string has the previously acquired value, so it will go into the "else" condition.
The question is: How can I listen to a "file finished loading" event in JavaScript to prevent this behaviour?
Thank you very much.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

野稚 2024-12-05 10:41:14

就 fetch 而言, my_string 为空是正常的。您需要订阅某些自定义事件或以某种方式传递回调。

NetUtil.asyncFetch(my_file, function(inputStream, status) {
    if (!Components.isSuccessCode(status)) {
        return;
    }
    my_string = NetUtil.readInputStreamToString(inputStream, inputStream.available());
    var evt = document.createEvent('Event');
    evt.initEvent('inputReady', true, true);
    evt.my_string = my_string;
    document.dispatchEvent(evt);
});

然后订阅此

document.addEventListener('inputReady', function(e){
    alert(e.my_string);
});

活动未测试

as far as fetch is async it's normal my_string to be empty. You need to subscribe for some custom event or pass a callback somehow.

NetUtil.asyncFetch(my_file, function(inputStream, status) {
    if (!Components.isSuccessCode(status)) {
        return;
    }
    my_string = NetUtil.readInputStreamToString(inputStream, inputStream.available());
    var evt = document.createEvent('Event');
    evt.initEvent('inputReady', true, true);
    evt.my_string = my_string;
    document.dispatchEvent(evt);
});

and then subscribe for this event

document.addEventListener('inputReady', function(e){
    alert(e.my_string);
});

P.S. Not tested

讽刺将军 2024-12-05 10:41:14

你好,我不熟悉 Firefox/Gecko 2.x 的 NetUtil,但这个概念看起来很熟悉。

我认为这是因为

 NetUtil.asyncFetch

之后调用您的回调函数

if (my_string.length == 0) {
//do something...
} else {
//do something else...
} 

在您为什么不尝试在正确的位置使用数据

    NetUtil.asyncFetch(my_file, function(inputStream, status) {
                if (!Components.isSuccessCode(status)) {
                    return;
                }
    my_string = NetUtil.readInputStreamToString(inputStream, inputStream.available());

    alert(my_string.length);  //is here is also be 0 ???????
    //do some stuff with the data
 ]);

hello i am not familiar with NetUtil of Firefox/Gecko 2.x but the concept look familiar.

i assume that is because the

 NetUtil.asyncFetch

call to your callback function after the

if (my_string.length == 0) {
//do something...
} else {
//do something else...
} 

why not you try using the data in correct place

    NetUtil.asyncFetch(my_file, function(inputStream, status) {
                if (!Components.isSuccessCode(status)) {
                    return;
                }
    my_string = NetUtil.readInputStreamToString(inputStream, inputStream.available());

    alert(my_string.length);  //is here is also be 0 ???????
    //do some stuff with the data
 ]);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文