Javascript 如何实现getter函数(使用回调)

Javascript 如何实现getter函数(使用回调),javascript,callback,xmlhttprequest,return-value,getter,Javascript,Callback,Xmlhttprequest,Return Value,Getter,我必须从MySQL数据库(基于用户id)请求JS脚本的数据 我没有找到一个简单的JavaScript解决方案,也不可能使用ajax加载数据,因为数据库在不同的域下可用 我使用PHP和curl实现了一个变通方法。 现在JS必须“等待”请求完成,但脚本当然是异步运行的,不会等待响应。 我知道在JS中等待是不可能的,但必须能够像这样返回值 我还尝试使用return作为另一个回调,但这当然不起作用,因为getter函数无论如何都会运行得更远 如何实现一个简单的getter,它“等待”并从HTTP请求返回

我必须从MySQL数据库(基于用户id)请求JS脚本的数据

我没有找到一个简单的JavaScript解决方案,也不可能使用ajax加载数据,因为数据库在不同的域下可用

我使用PHP和curl实现了一个变通方法。
现在JS必须“等待”请求完成,但脚本当然是异步运行的,不会等待响应。
我知道在JS中等待是不可能的,但必须能够像这样返回值

我还尝试使用
return
作为另一个回调,但这当然不起作用,因为getter函数无论如何都会运行得更远

如何实现一个简单的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;
}
var XMLHttpFactories=[
函数(){返回新的XMLHttpRequest()},
函数(){返回新的ActiveXObject(“Msxml2.XMLHTTP”)},
函数(){返回新的ActiveXObject(“Msxml3.XMLHTTP”)},
函数(){返回新的ActiveXObject(“Microsoft.XMLHTTP”)}
];
函数createXMLHTTPObject(){
var xmlhttp=false;

对于(var i=0;i,我看不出您的代码总体上有什么问题


当您发出请求时,提供回调。当响应返回时,您可以轻松地检测到响应,执行回调并将结果传递给它。

您真的不应该尝试同步等待网络请求完成。请求可能永远不会完成,可能会挂起并花费很长时间,等等。因为JavaScript是单一的readed,事实上所有主要的浏览器引擎都是单线程的,这将导致整个页面在等待请求时挂起,在某些浏览器中,可能会导致整个浏览器挂起

您应该做的是像这样替换代码:

var returned = some_request('http://example.com/query');
do_something_with(returned);
some_request('http://example.com/query', function (returned) {
  do_something_with(returned);
});
代码如下:

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

这样,您将永远不会导致页面或浏览器挂起等待请求,只需在收到响应后即可完成工作。

这是客户端应用程序的工作方式。
这不是程序性的,而是通过事件工作。

  • 您将屏幕呈现给用户并等待
  • 用户执行一个操作
  • 调用服务器,设置回调,然后等待
  • 响应出现,您执行回调并等待另一个步骤2
  • 与其试图改变这一点,不如适应它,否则这将是一次痛苦的经历

    Javascript不是多线程的。它意味着一次只运行一条语句。真正的异步性来自服务器响应和调用回调所花费的时间。你永远不知道哪个调用将首先出现,并且需要在构建程序时牢记这一点