我正在尝试一些非常简单的第一个Firefox附加组件,重要的部分是:
步骤1)调用外部API以检索一些数据 步骤2)使用第一次检索的数据再次调用该API以获得更多信息。
现在,我首先在同步模式下使用XMLHttpRequest实现它,因为我认为需要等待第2步,这迫使我这样做。两次调用处理API调用的函数,使用XMLHttpRequest并解析响应。细
然后我来到Mozilla开发网络中的各种文档,鼓励您在异步模式下使用XMLHttpRequest,所以我尝试了。
基于multiple XMLHttpRequests和其他人的实施,我提出了以下代码。
我的问题是:这是正确的方法吗?我应该回到使用同步模式吗?它的工作方式与此类似,但它并没有让我觉得你会使用正确的AJAX模式......
// first call
var username = foo;
var password = bar;
var startOffset = 0; // initial value
var url = encodeURIComponent('https://theapiurl.com/query=' + startOffset);
doRequest();
function doRequest() {
makeRequest(url, username, password);
}
function makeRequest(url, username, password) {
var http_request = new XMLHttpRequest();
if (http_request.overrideMimeType) {
http_request.overrideMimeType('text/xml');
}
if (!http_request) {
alert('Cannot create XMLHTTP instance');
return false;
}
http_request.onreadystatechange = function() {
alertContents(http_request);
};
http_request.open('GET', url, true, username, password);
http_request.send(null);
}
function alertContents(http_request) {
if (http_request.readyState == 4) {
if (http_request.status == 200) {
if (startOffset == 0) {
startOffset = 45; // this value would be extracted from 'http_request'
url = encodeURIComponent('https://theapiurl.com/query=' + startOffset);
// second call, parameter startOffset has changed
doRequest();
} else {
}
} else {
alert('There was a problem with the request.');
}
http_request.onreadystatechange = function fnNull(){};
}
}
答案 0 :(得分:3)
您应始终避免执行同步网络请求,因为它会阻止GUI运行,直到您收到响应。仅仅因为网络可能对您来说很快,您不应该认为它对您的所有用户来说都很快。