Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/407.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何让JS等待协议执行完成_Javascript_Custom Url Protocol - Fatal编程技术网

Javascript 如何让JS等待协议执行完成

Javascript 如何让JS等待协议执行完成,javascript,custom-url-protocol,Javascript,Custom Url Protocol,我有一个自定义URL协议处理程序cgit:[…] 它启动一个后台进程,在本地机器上配置一些东西。该协议工作正常,我正在从JavaScript启动它(目前使用的是document.location='cgit:[…]”),但实际上我希望JavaScript等待相关程序退出 基本上,我希望JavaScript执行以下步骤: JavaScript做了一些事情 JavaScript启动cgit:[…] Javascript会等待cgit:[…]退出 JavaScript还做了其他的事情 代码: 或:

我有一个自定义URL协议处理程序
cgit:[…]

它启动一个后台进程,在本地机器上配置一些东西。该协议工作正常,我正在从JavaScript启动它(目前使用的是
document.location='cgit:[…]”
),但实际上我希望JavaScript等待相关程序退出


基本上,我希望JavaScript执行以下步骤:

  • JavaScript做了一些事情

  • JavaScript启动
    cgit:[…]

  • Javascript会等待cgit:[…]退出

  • JavaScript还做了其他的事情


  • 代码:

    或:



    如果可能的话,有什么想法吗?

    因为这并不是window.location的预期用途,所以我怀疑是否有简单的方法。我的建议是使用Ajax请求并让C++程序在完成时发送响应。这样,在请求完成后,C++程序可以运行什么代码需要运行。< /P> < P>因为我没有找到一个合适的方法来解决我的问题,使用Ajax请求或类似的东西,我终于用一种丑陋的工作方式解决了我的问题,包括<代码> XmlHttpRequest < /Calp> < /P>
    对于启动协议,我仍然在使用
    document.location=cgit:[…]

    我使用的是一个服务器端系统,包括“锁定文件”——类似于一般的虚拟文件,为每个请求生成名称

    一旦用户请求打开自定义协议,就会在服务器上专门为该协议打开请求生成这样一个文件

    我在放置这些文件的服务器上创建了一个名为“$locks”的文件夹。一旦协议相关程序退出,相应的文件将被删除

    该网站使用
    XmlHttpRequest
    不断检查请求文件是否仍然存在,如果不存在,则触发回调(例如测试间隔:1秒)

    新文件的结构如下所示:

    • lockThisRequest.php
      :它基于
      req
      url参数在$locks目录中创建一个文件
    • unlockThisRequest.php
      :它删除$locks目录中的一个文件;同样基于
      req
      url参数
    它的JavaScript部分是:

    function launchCgit(params,callback)
    {
        var lock = /* Generate valid filename from params variable */;
    
        // "Lock" that Request (means: telling the server that a request with this ID is now in use)
        var locker = new XmlHttpRequest();
        locker.open('GET', 'lockThisRequest.php?req='+lock, true)
        locker.send(null);
    
        function retry()
        {
            // Test if the lock-file still exists on the server
            var req = new XmlHttpRequest();
            req.open('GET', '$locks/'+lock, true);
            req.onReadyStateChanged=function()
            {
                if (req.readyState == 4)
                {
                    if (req.status == 200)
                    {
                        // lock-file exists -> cgit has not exited yet
                        window.setTimeout(retry,1000);
                    }
                    else if (req.status == 404)
                    {
                        // lock-file not found -> request has been proceeded
                        callback();
                    }
                }
            }
            req.send(null);
        }
        document.location = 'cgit:'+params; // execute custom protocol
        retry(); // initialize lockfileCheck-loop
    }
    
    我们的年龄是:

    launchCgit("doThisAndThat",function()
                               {
                                   alert("ThisAndThat finished.");
                               });
    
    lockThisRequest.php
    -文件:

    <?php
        file_put_contents("$locks/".$_GET["req"],""); // Create lock file
    ?>
    

    协议执行的本地程序/脚本可以简单地调用如下内容:

    #!/bin/bash
    curl "http://servername/unlockThisRequest.php?req=$1"
    
    完成之后


    正如我刚才所说的,这是可行的,但它并不是一件好事(如果您一直跟踪这些说明,恭喜您)

    我更喜欢一种更简单的方法,(重要)这也可能会导致
    lockThisRequest.php
    unlockThisRequest.php
    文件出现安全问题

    我对这个解决方案很满意,因为我只在受密码保护的私人页面上使用它。但是,如果您计划在公共或非保护页面上使用它,您可能需要为php文件添加一些安全性



    无论如何,这个解决方案现在对我来说是可行的,但是如果有人找到更好的方法——例如使用ajax请求——他/她将非常欢迎将这种方法添加到相应的stackoverflow文档或类似文档中,并在此线程上发布指向它的链接。我仍然对其他解决方案感兴趣:)

    添加一些代码可能有助于回答这个问题。好的,我将在什么是cgit:[…]将要启动中编辑一些内容?如果我正确理解了这个问题,一旦您设置了document.location,您将从页面重定向,停止任何JS的运行。也许你想打一个AJAX电话?@Leso_KN因为这并不是window.location的预期用途,所以我怀疑是否有简单的方法。我的建议是使用Ajax请求(这对于JQuery来说非常简单),并且C++程序在完成时发送响应。那样,任何代码在C++程序运行之后都可以运行在 Debug <代码>函数(或等效)中。
    <?php
        file_put_contents("$locks/".$_GET["req"],""); // Create lock file
    ?>
    
    <?php
        unlink("../\$locks/".$_GET["req"]); // Delete lock file
    ?>
    
    #!/bin/bash
    curl "http://servername/unlockThisRequest.php?req=$1"