为了账号安全,请及时绑定邮箱和手机立即绑定

首先尝试保护文件不被访问

首先尝试保护文件不被访问

繁华开满天机 2024-01-03 14:37:51
function downloadUrl(url, callback) {    Transition();    var request = window.ActiveXObject ?        new ActiveXObject('Microsoft.XMLHTTP') :        new XMLHttpRequest;    request.onreadystatechange = function() {        if (request.readyState == 4) {            request.onreadystatechange = doNothing;            callback(request, request.status);        }    };    request.open('GET', url, true);    request.send(null);    Transition();}function Transition() {    var xmlhttp = window.ActiveXObject ?        new ActiveXObject('Microsoft.XMLHTTP') :        new XMLHttpRequest;    xmlhttp.onreadystatechange = function() {        if (xmlhttp.readyState == 4) {            xmlhttp.onreadystatechange = doNothing;            callback(xmlhttp, xmlhttp.status);        }    };    xmlhttp.open("GET", "transition.php", true);    xmlhttp.send();}啊,是的,我正在尝试使用 jQuery 并打开会话变量,并在执行另一个 jQuery 函数后使用上述方法关闭该会话变量。transition.php是打开和关闭变量的文件,另一个 jQuery 函数downloadUrl只是下载 XML 格式文件。总之,我有一个.php文件需要保持打开状态足够长的时间才能访问其中的数据,然后立即关闭。
查看完整描述

1 回答

?
慕姐4208626

TA贡献1852条经验 获得超7个赞

更新:onreadystatechange更正了和的一些措辞readyState

你打开或关闭东西的技巧是一个好主意,尽管我不确定它是否有效或安全。无论如何,您所显示的代码的直接问题是它没有考虑您正在使用异步请求的事实。

您的代码按照编写的顺序运行,但异步请求不会阻止执行,因此第二个XMLHttpRequesttourl几乎立即触发,并且早在第一个Transition()完成之前就触发了。

如果您需要事情按顺序发生,则需要从请求onreadystatechange事件处理程序调用后续步骤,该事件处理程序会在请求状态更改时触发。代码已经测试了readyState 4,这意味着请求已完成。因此,请求完成后,调用的代码就会运行。

我不确定你的一些代码在做什么,也许它是在上下文之外复制的(例如你的callback, and是什么doNothing?)。

这是一个基于您的代码的工作 JSFiddle,对所有 3 个请求使用虚拟 URL。我已经包含了一堆日志记录,打开您的开发控制台以查看事件启动、运行和完成的顺序。

这个想法是将回调传递给第一个Transition,该回调将在请求完成后被触发:

function downloadUrl() {
    Transition(foo);
}

Transition将回调作为参数,并在完成时触发它:

function Transition(callback) {


    // ... your code ... 


    xmlhttp.onreadystatechange = function() {

        if (xmlhttp.readyState == 4) {

            if (callback) {

                callback();

            }

        }

    };


    // ... your code


}

这foo()是一个实际下载 的函数url,基本上是您所拥有的所有内容downloadUrl(),但不调用Transition.


完成后foo(),您需要Transition再次调用,但这次我们不想在完成后触发任何内容,因此我们通过false,这Transition将测试并跳过尝试执行。


我写得很快,感觉有点笨拙,您可能可以稍微修改一下以使其更整洁,但它演示了使用事件处理程序通过异步请求顺序执行操作的基本思想。


查看完整回答
反对 回复 2024-01-03
  • 1 回答
  • 0 关注
  • 79 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信