2016-08-11 26 views
0

我有一個自定義URL協議處理程序cgit:[...]如何讓JS等到協議執行完畢

它啓動了一個後臺進程,其配置在本地機器上的一些東西。該協議工作正常,我從JavaScript啓動它(目前使用document.location = 'cgit:[...]'),但我真的希望JavaScript等到相關程序退出。


所以基本上我想要的JavaScript做的步驟:

  1. 的JavaScript做一些事情

  2. 的JavaScript推出cgit:[...]

  3. 的Javascript等待cgit:[...]退出

  4. 的JavaScript做別的事情


代碼:

function launchCgit(params) 
{ 
    showProgressBar(); 
    document.location="cgit:"+params; 
    document.addEventListener(/* CGit-Program exited event */, hideProgressBar); 
} 

或:

function launchCgit(params) 
{ 
    showProgressBar(); 
    // setLocationAndWait("cgit:"+params); 
    hideProgressBar(); 
} 

這是可能的任何想法?

+0

添加一些代碼可能有助於回答問題。 – c0d3rman

+0

好的,我將在 –

+0

中編輯一些cgit:要啓動的是什麼? – matmo

回答

1

,因爲我沒有找到使用AJAX請求或任何類似,我使用了一種-的醜workarround包括XmlHttpRequest


對於啓動協議終於解決了我的問題解決我的問題以適當的方式我仍然在使用document.location=cgit:[...]

我正在使用包含「鎖定文件」的服務器端系統 - 這就像通用虛擬文件,併爲每個請求生成名稱。

一旦用戶請求打開自定義協議,就會在服務器上專門爲該協議打開請求生成這樣的文件。

我在放置這些文件的服務器上創建了一個名爲「$ locks」的文件夾。一旦與協議相關的程序退出,相應的文件將被刪除。

網站持續檢查使用XmlHttpRequest的請求文件是否仍然存在,如果沒有(例如測試之間的測試時間:1秒)則觸發回調。

新文件的結構如下:

  • lockThisRequest.php:它的基礎上,req網址參數的$鎖目錄中創建一個文件。
  • 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 
} 

Ussage是:

launchCgit("doThisAndThat",function() 
          { 
           alert("ThisAndThat finished."); 
          }); 

lockThisRequest.php -file:

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

unlockThisRequest.php

<?php 
    unlink("../\$locks/".$_GET["req"]); // Delete lock file 
?> 

本地程序/由協議執行的腳本可以簡單地調用類似:

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

它完成之後。


正如我剛纔說的這個工作,但它的東西,而不喜歡好的其他(恭喜如果你不停地跟蹤那些指令)

我寧願者優先一種更簡單的方式和(重要)這也可能導致lockThisRequest.phpunlockThisRequest.php文件的安全問題!

我很好用這個解決方案,因爲我只在受密碼保護的私人頁面上使用它。但是,如果您打算在公共或不受保護的頁面上使用它,您可能需要爲php文件添加一些安全性。


不管怎麼說,該解決方案現在對我的作品,但如果有人找到更好的方式來做到這一點 - 通過使用Ajax請求 - 例如,他/她會很歡迎這種方式添加到相應的stackoverflow-文檔或類似內容,並在此主題上發佈鏈接。我仍然對替代解決方案感興趣:)

1

因爲這不是真正的預期的window.location使用,我懷疑有一個簡單的方法。我的建議是使用AJAX請求,並讓C++程序在完成時發送響應。這樣,在請求完成後,可以運行C++程序之後,無論需要運行哪些代碼。

相關問題