为了更好地组织代码,我不想在我的req.onreadystatechange处理程序中放置回调函数,而是简单地返回数据。
在下面的javascript中,“raw_data”var未定义,因为在ajax响应之前调用了parse_data()函数。
function dostuff(){
var raw_data = ajax_fetch_data();
var parsed_data = parse_data(raw_data);
}
在ajax_fetch_data()中的req.onreadystatechange返回数据之前,是否可以不调用parse_data()?
我不喜欢将parse_data()调用嵌套为ajax_fetch_data()中的回调。
答案 0 :(得分:1)
Ajax中的A意味着“异步”。如果您的调用是异步的,则无法使用类似的返回值。您必须通过回调等待事件。但是,您可以发送如下的同步请求:
var req = new XMLHttpRequest();
req.open('GET', 'http://www.example.org/', false);
req.send(null);
if(req.status == 200)
return req.responseText;
其中第二行的false
指定同步性质(第三个参数的默认值为true
)。
Mozilla Developer Center还有更多内容。
答案 1 :(得分:1)
此代码过于模糊: var raw_data = ajax_fetch_data();
通常就是这样:
// url = ...
// data = ...
create_ajax_request(url, data, callback);
// This will continue to execute like normal
// ...
// ...
// ...
// Now, in a differnt part of the code:
function callback() {
// Sometime later, when AJAX returns data, this is called.
}
所以基本上你有两个线程:你“开始”一个请求的主程序,以及在请求完成时调用的回调函数。这仍然忽略了细节。
如果你想要SJAX(同步javascript& xml的一个不好的缩写),那么你可以使用像jQuery这样的东西:
var result = null;
$.ajax({
aync: false,
data: data,
url: url,
success: function(data) {
result = data;
}
});
// result is populated before $.ajax() moves on, so you can use it right after
console.log('result: ' + result);
但是,这会执行忙等待(即,您的浏览器被卡住/锁定,直到数据进入...可能是几毫秒,可能是一分钟,谁知道)。所以这只应该在必要时使用。如果您只想获取数据然后进行处理,请使用回调。
// Call this to start a request
function startRequest() {
data = ...
create_ajax_request(url, data, continueRequest);
}
// This is called once we have the data
function continueRequest(data) {
alert(data);
}
这是更典型的AJAX程序。