首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何使JS等待协议执行完成

如何使JS等待协议执行完成
EN

Stack Overflow用户
提问于 2016-08-11 14:15:40
回答 2查看 354关注 0票数 1

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

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

因此,基本上,我希望JavaScript执行的步骤:

  1. JavaScript做了一些事情
  2. JavaScript推出cgit:[...]
  3. Javascript等待直到cgit:[...]退出
  4. JavaScript做了其他的事情

代码:

代码语言:javascript
运行
AI代码解释
复制
function launchCgit(params)
{
    showProgressBar();
    document.location="cgit:"+params;
    document.addEventListener( /* CGit-Program exited event */, hideProgressBar );
}

或者:

代码语言:javascript
运行
AI代码解释
复制
function launchCgit(params)
{
    showProgressBar();
    // setLocationAndWait("cgit:"+params);
    hideProgressBar();
}

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-12 09:58:55

由于我没有找到合适的方法来使用ajax请求或任何类似的方法来解决我的问题,所以我最终使用了包括XmlHttpRequest在内的一种丑陋的工作环境来解决我的问题。

对于启动协议,我仍在使用document.location=cgit:[...]

我正在使用一个服务器端系统,包括“锁文件”--这就像一般的虚拟文件,为每个请求生成了名称。

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

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

该网站继续使用XmlHttpRequest检查请求的文件是否仍然存在,并在不存在的情况下触发回调(例如,测试之间的超时:1秒)。

新文件的结构如下:

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

它的JavaScript部分是:

代码语言:javascript
运行
AI代码解释
复制
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
}

乌萨奇是:

代码语言:javascript
运行
AI代码解释
复制
launchCgit("doThisAndThat",function()
                           {
                               alert("ThisAndThat finished.");
                           });

lockThisRequest.php-file:

代码语言:javascript
运行
AI代码解释
复制
<?php
    file_put_contents("$locks/".$_GET["req"],""); // Create lock file
?>

unlockThisRequest.php

代码语言:javascript
运行
AI代码解释
复制
<?php
    unlink("../\$locks/".$_GET["req"]); // Delete lock file
?>

协议执行的本地程序/脚本只需调用以下内容:

代码语言:javascript
运行
AI代码解释
复制
#!/bin/bash
curl "http://servername/unlockThisRequest.php?req=$1"

在它完成之后。

就像我刚才说的,这是可行的,但这不是什么好事(恭喜你,如果你跟踪那些指示)

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

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

无论如何,这个解决方案现在对我有用,但是如果有人找到了更好的方法--例如通过使用ajax请求--他/她将非常欢迎以这种方式添加到相应的堆栈溢出文档或类似的文档中,并在这个线程上发布到它的链接。我仍然对其他解决方案感兴趣:)

票数 1
EN

Stack Overflow用户

发布于 2016-08-12 08:36:25

由于这并不是对window.location的预期使用,所以我会怀疑是否有一种简单的方法。我的建议是使用AJAX请求,并让c++程序在完成时发送响应。这样,任何在c++程序之后运行的代码都可以在请求完成时运行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38906948

复制
相关文章
Firebase 如何创建登录 Token
Firebase 的 token 可以使用 firebase 命令行工具来进行创建。
HoneyMoose
2021/04/02
2.5K0
Firebase 如何创建登录 Token
MySQL创建计算字段及基本函数
select concat(vend_name,'(',vend_country,')') from vendors order by vend_name;
小末快跑
2019/07/03
1.9K0
第十章:创建计算字段
本文介绍了如何创建计算字段,包括拼接字段、使用别名、执行算数计算等。
用户1134788
2018/01/05
6240
如何在Python中创建AGE计算器Web App PyWebIO?
为了计算此 Web 应用程序的日期,我们将默认使用 Python 附带的日期时间包。该软件需要用户的姓名和出生日期,然后使用当前日期计算他们的年龄(以年为单位)。输出将使用 PyWebIO 的输出例程显示在网页上。
很酷的站长
2023/08/11
2940
如何在Python中创建AGE计算器Web App PyWebIO?
在Oracle中创建自动增长字段
Oracle在创建表时和其他的数据库有点不一样,MySQL中可以使用“auto_increment”即可。但是Oracle有点麻烦,需要使用序列和触发器达到目的。
星哥玩云
2022/08/17
3.1K0
在Oracle中创建自动增长字段
firebase怎么用_firebase是什么
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/168361.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/20
4.3K0
firebase怎么用_firebase是什么
第7课 创建计算字段拼接字段执行简单的算术运算
什么是计算字段? 就是直接从数据库中检索出转换,计算或者格式化的数据,而不是检索出数据之后,再在客户端应用程序中重新格式化。
desperate633
2018/08/22
6780
如何在js中创建对象
七夕临近了,没有对象的来创建一个吧 使用对象字面量: const o = { name: "zehan", greeting() { return `Hi, 我是${this.name}`; } }; o.greeting(); // "Hi, zehan" 使用构造函数: function Person(name) { this.name = name; } Person.prototype.greeting = function () { return `Hi, 我是
ZEHAN
2020/09/23
7.8K0
如何在Mac中创建MiniKube
Minikube是一个工具,可以在本地轻松运行Kubernetes。 Minikube在笔记本电脑的VM中运行单节点Kubernetes集群,供希望尝试Kubernetes或日常开发的用户使用。
方志朋
2022/05/08
2.5K0
如何在Mac中创建MiniKube
如何在Dynamo中创建UI
本文介绍了如何在Dynamo中创建UI,通过使用WPF技术实现了窗口的创建和交互。首先介绍了IronPython和Dynamo的基础知识,然后讲解了实现原理和准备工作。最后通过具体的操作步骤和代码示例讲解了如何在Dynamo中创建UI。
企鹅号小编
2018/01/05
2.2K0
如何在Dynamo中创建UI
07-08 创建计算字段使用函数处理数据第7章 创建计算字段第8章 使用函数处理数据
上述例子中,存储在表中的数据都不是应用程序所需要的。我们需要直接从数据库中检索出转换、计算或格式化过的数据,而不是检索出数据,然后再在客户端应用程序中重新格式化。
用户1250179
2018/08/02
3.8K0
07-08 创建计算字段使用函数处理数据第7章 创建计算字段第8章 使用函数处理数据
如何在 WordPress 中创建联系表格?
假设我们有一个 WordPress 网站,并且我们想要添加一个功能,让他们可以联系他们所拥有的查询。我们可以通过使用网站上的 WordPress 插件添加联系表格来做到这一点。因此,这将为你的访问者提供一种与你联系的方式,当他们需要帮助或有什么要分享的时候。
海拥
2022/12/19
3K0
如何在 WordPress 中创建联系表格?
如何在 WordPress 中创建登录页面
登陆页面: 登陆页面是为特定受众制定的具有特定目标的目标页面,可以描述为“一页一目的”。登陆页面必须有一个“号召性用语”,并牢记特定目标。成功的着陆页是具有更高转化率、更高参与度和更高质量潜在客户的页面。
海拥
2022/10/04
3K0
如何在 WordPress 中创建登录页面
如何在git中创建新分支
介绍 Git 是一个开源版本控制系统,用于在软件开发过程中跟踪更改。它的相互独立的分支模型使其脱颖而出。分支可以基于以前版本的软件来保持当前进度的完整性,同时处理错误修复或新功能。 在本地创建 Git 存储库 要创建新的 Git 存储库,请在终端中输入以下命令: mkdir rumenz cd rumenz git init 这将在 rumenz 目录中创建并初始化一个新的 Git 存储库。创建一个新的降价文件并添加一行文本: echo This is a line of text > rumenz.md
入门笔记
2022/06/02
3K0
如何在 SwiftUI 中创建条形图
条形图以矩形条的形式呈现数据的类别,其宽度和高度与它们表示的值成比例。本文将展示如何创建一个垂直条形图,其中矩形的高度将代表每个类别的值。
Swift社区
2022/12/12
5.4K0
如何在 SwiftUI 中创建条形图
如何在R中创建日历热图
首先,我们运行Paul Bleicher创建的calendarHeat函数以显示日历热图。 其次,我们创建一些随机的时间序列数据。 最后,我们在两个调色板中绘制时间序列。
用户1359560
2020/04/01
4.6K0
如何在R中创建日历热图
点击加载更多

相似问题

如何在Tableau中创建计算字段?

12

如何在mysql中创建计算字段?

23

如何在firebase中创建必需的字段验证

11

创建输入字段,如Google

12

如何在opentaps/OFBiz中创建计算字段?

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档