Javascript 如何实现getter函数(使用回调)
我必须从MySQL数据库(基于用户id)请求JS脚本的数据 我没有找到一个简单的JavaScript解决方案,也不可能使用ajax加载数据,因为数据库在不同的域下可用 我使用PHP和curl实现了一个变通方法。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请求返回
现在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不是多线程的。它意味着一次只运行一条语句。真正的异步性来自服务器响应和调用回调所花费的时间。你永远不知道哪个调用将首先出现,并且需要在构建程序时牢记这一点