Javascript 如何让JS等待协议执行完成
我有一个自定义URL协议处理程序Javascript 如何让JS等待协议执行完成,javascript,custom-url-protocol,Javascript,Custom Url Protocol,我有一个自定义URL协议处理程序cgit:[…] 它启动一个后台进程,在本地机器上配置一些东西。该协议工作正常,我正在从JavaScript启动它(目前使用的是document.location='cgit:[…]”),但实际上我希望JavaScript等待相关程序退出 基本上,我希望JavaScript执行以下步骤: JavaScript做了一些事情 JavaScript启动cgit:[…] Javascript会等待cgit:[…]退出 JavaScript还做了其他的事情 代码: 或:
cgit:[…]
它启动一个后台进程,在本地机器上配置一些东西。该协议工作正常,我正在从JavaScript启动它(目前使用的是document.location='cgit:[…]”
),但实际上我希望JavaScript等待相关程序退出
基本上,我希望JavaScript执行以下步骤:
cgit:[…]
代码: 或:
如果可能的话,有什么想法吗?因为这并不是window.location的预期用途,所以我怀疑是否有简单的方法。我的建议是使用Ajax请求并让C++程序在完成时发送响应。这样,在请求完成后,C++程序可以运行什么代码需要运行。< /P> < P>因为我没有找到一个合适的方法来解决我的问题,使用Ajax请求或类似的东西,我终于用一种丑陋的工作方式解决了我的问题,包括<代码> XmlHttpRequest < /Calp> < /P>
对于启动协议,我仍然在使用
document.location=cgit:[…]
我使用的是一个服务器端系统,包括“锁定文件”——类似于一般的虚拟文件,为每个请求生成名称
一旦用户请求打开自定义协议,就会在服务器上专门为该协议打开请求生成这样一个文件
我在放置这些文件的服务器上创建了一个名为“$locks”的文件夹。一旦协议相关程序退出,相应的文件将被删除
该网站使用XmlHttpRequest
不断检查请求文件是否仍然存在,如果不存在,则触发回调(例如测试间隔:1秒)
新文件的结构如下所示:
:它基于lockThisRequest.php
url参数在$locks目录中创建一个文件req
:它删除$locks目录中的一个文件;同样基于unlockThisRequest.php
url参数req
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++程序运行之后都可以运行在
<?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"