gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 20:21:44 25 4
gpt4 key购买 nike

我必须从 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;
}

最佳答案

你真的,真的不应该尝试同步等待网络请求完成。请求可能永远不会完成,可能会挂起并花费很长时间,等等。由于 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);
});

这样,您将永远不会导致您的页面或浏览器因等待请求而挂起,并且可以在收到响应后简单地完成工作。

关于javascript - 如何实现 getter 函数(使用回调),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3678434/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com