2010-09-09 62 views
2

我不得不從MySQL數據庫(基於用戶ID),請求對JS腳本的數據。如何實現吸氣功能(使用回調)

我沒有找到JavaScript的一個簡單的解決方案,這是不可能的加載用ajax的數據,因爲該數據庫根據不同的域名。

我使用PHP和curl實現了一個解決方法。
現在JS必須「等待」完成請求,但腳本當然是異步運行的,不會等待響應。
我知道在JS中等待是不太可能的,但它必須能夠像這樣返回值。

我也嘗試使用return另一個回調,但是這並不能當然的工作,因爲消氣功能將進一步運行反正。

我怎樣才能實現一個簡單的getter方法,「等待」,並返回從HTTP請求的響應?

感謝您的任何其他線索。我現在真的迷失了。
這是從源代碼中的摘錄:

/** 
* Simple getter which requests external data 
*/ 
function simple_getter() { 

    // http request using a php script, because ajax won't work crossdomain 
    // this request takes some time. function finished before request is done. 

    /* Example */ 
    var url = "http://example-url.com/get_data.php?uid=1234"; 
    var response_callback = handle_result_response; 

    var value = send_request(url, response_callback); 

    value = value.split('*')[0]; 

    if (value === '' || value == const_pref_none) { 
     return false; 
    } 

    /* 1. returns undefinied, because value is not yet set. 
     2. this as a callback makes no sense, because this function 
      will run asynchronous anyway. */ 
    return value; 
} 

附加信息關於所使用的功能:

/** 
* Callback for the send_request function. 
* basically returns only the responseText (string) 
*/ 
function handle_result_response(req) { 
    // do something more, but basically: 
    return req.responseText; 
} 

/** 
* Requests data from a database (different domain) via a PHP script 
*/ 
function send_request(url, response_callback) { 
    var req = createXMLHTTPObject(); 

    if (!req) 
     return; 

    var method = (postData) ? "POST" : "GET"; 

    req.open(method, url, true); 
    req.setRequestHeader('User-Agent','XMLHTTP/1.0'); 

    // More not relevant source code 
    // ... 

    req.onreadystatechange = function() { 
     // More not relevant source code 
     // ... 

     response_callback(req); 
    } 

    if (req.readyState == 4) 
     return; 

    req.send(postData); 

} 

不是真的相關的代碼,但是對於HTTP請求需要:

var XMLHttpFactories = [ 
    function() {return new XMLHttpRequest()}, 
    function() {return new ActiveXObject("Msxml2.XMLHTTP")}, 
    function() {return new ActiveXObject("Msxml3.XMLHTTP")}, 
    function() {return new ActiveXObject("Microsoft.XMLHTTP")} 
]; 


function createXMLHTTPObject() { 
    var xmlhttp = false; 

    for (var i=0; i<XMLHttpFactories.length; i++) { 

     try { 
      xmlhttp = XMLHttpFactories[i](); 
     } catch (e) { 
      continue; 
     } 

     break; 
    } 

    return xmlhttp; 
} 

回答

3

你真的,真的不應該試圖同步等待一個網絡請求來完成。請求可能永遠不會完成,可能會掛起並需要很長時間,等等。由於JavaScript是單線程的,實際上所有主要的瀏覽器引擎都是單線程的,這會導致整個頁面在等待請求時掛起,並且在某些瀏覽器中可能導致整個瀏覽器掛起。

你應該做的是這樣的替換代碼:用這樣的代碼

var returned = some_request('http://example.com/query'); 
do_something_with(returned); 

some_request('http://example.com/query', function (returned) { 
    do_something_with(returned); 
}); 

這樣的話,你會不會引起你的頁面或掛起等待瀏覽器請求,並且可以在響應進入後簡單地完成工作。

0

我看不出你的代碼有什麼問題。

當您提出請求時,請提供回調。當響應返回時,您可以輕鬆檢測到,執行回調並將結果傳遞給它。

0

這是客戶端應用程序的工作方式。
它不是程序性的,而是按事件工作的。

  1. 你目前的屏幕給用戶,並等待
  2. 用戶進行操作
  3. 你調用服務器,設置回調,等待
  4. 的響應來你執行回調並等待作爲另一步2

與其試圖改變這種情況,你需要適應,否則將是一個痛苦的經歷。

Javascript不是多線程的。這意味着一次運行一個聲明。真正的異步來自服務器響應和調用回調的時間。你永遠不知道哪個電話會先來,需要根據這個電話來建立你的節目。