Javascript 确保异步GET/POST请求已完成,然后继续
嘿,伙计们,在过去的几个小时里,我一直在试图解决这个问题,我决定在睡觉前把它扔到这里,不管怎样,问题是我需要确保GET/POST请求在继续执行代码之前得到100%的处理,我用firefox插件sdk中的计时器破解了这个问题,但因为这是java脚本,它锁定了ui,所以我一直在寻找解决方案,我偶然发现了Felix Kling的潜在解决方案。虽然我尝试过,但没有成功,所以我想知道是否有人能告诉我我做错了什么,或者我甚至不能用这个解决方案来完成我想做的事情Javascript 确保异步GET/POST请求已完成,然后继续,javascript,post,get,firefox-addon,firefox-addon-sdk,Javascript,Post,Get,Firefox Addon,Firefox Addon Sdk,嘿,伙计们,在过去的几个小时里,我一直在试图解决这个问题,我决定在睡觉前把它扔到这里,不管怎样,问题是我需要确保GET/POST请求在继续执行代码之前得到100%的处理,我用firefox插件sdk中的计时器破解了这个问题,但因为这是java脚本,它锁定了ui,所以我一直在寻找解决方案,我偶然发现了Felix Kling的潜在解决方案。虽然我尝试过,但没有成功,所以我想知道是否有人能告诉我我做错了什么,或者我甚至不能用这个解决方案来完成我想做的事情 download_status(downloa
download_status(download_database());
function download_status(downloadStatus){
if(downloadStatus==0){
console.log(regexArray.length);
}
else{
console.log("oh no");
}
}
function download_database(){
var downloadDone = 0;
var requestDB = request.Request({
url: "http://phyzical.pythonanywhere.com/download_db/",
onComplete: function(response){
console.log(response.statusText);
if(response.json == null){
console.log("cannot retreive json properly.")
}
else{
var dbInfoLength = response.json.length;
var idNumber = 0;
for(var x=0;x<dbInfoLength;x++){
try{
var patt1=new RegExp(response.json[x].regex);
idArray[idNumber] = response.json[x].id;
regexArray[idNumber] = response.json[x].regex;
incorrectMessageArray[idNumber] = response.json[x].incorrect_information;
correctMessageArray[idNumber] = response.json[x].correct_information;
idNumber++;
}
catch(e){
console.log("The annotation with the id: \""+ response.json[x].id+" " + e.message + "\" is wrong.");
}
}
downloadDone = 0;
}
},
}).get();
return downloadDone;
}
download_status(下载_数据库());
功能下载状态(下载状态){
如果(下载状态==0){
控制台日志(regexArray.length);
}
否则{
控制台日志(“哦不”);
}
}
函数下载_数据库(){
var downloadDone=0;
var requestDB=request.request({
url:“http://phyzical.pythonanywhere.com/download_db/",
未完成:功能(响应){
console.log(response.statusText);
if(response.json==null){
log(“无法正确检索json”)
}
否则{
var dbInfoLength=response.json.length;
变量idNumber=0;
对于(var x=0;x如果您需要在继续之前返回响应,那么您实际上有两个选项:一个是将响应传递到AJAX响应处理程序中的回调中。一旦收到响应,回调将是应用程序继续的入口点
另一种选择是使用同步XHR请求。但是,这种方法的缺点是,在请求完成之前,您的UI将被锁定
干杯如果您需要在继续之前返回响应,那么您确实有两个选择:一个是将响应传递到AJAX响应处理程序中的回调中。一旦收到响应,回调将是应用程序继续的入口点
另一种选择是使用同步XHR请求。但是,这种方法的缺点是,在请求完成之前,您的UI将被锁定
干杯目前我无法回答大部分代码,但当我遇到此类问题时,我通常会调用“下一步”函数(在您的情况下是download_status())在Get的onComplete内部,可以是硬编码的,也可以是回调。这将确保它在完成后被调用。目前我不能回答很多代码,但是当我遇到这种类型的问题时,我通常会调用“next”函数(在您的情况下,是download\u status())在Get的onComplete内部,可以是硬编码的,也可以是回调。这将确保它在完成后被调用。插件SDK的功能允许你用优雅做你想做的事。插件SDK的功能允许你用优雅做你想做的事。我没有实现你的任何逻辑,但我已经重写了你的需求st代码(因为这正是您遇到的问题)使用jQuery的AJAX方法而不是Firefox的请求
<h1>JSON Data Fetch Test</h1>
<div id="data"></div>
<script src="jquery-2.0.3.min.js"></script>
<script>
var dataBlock = document.getElementById("data");
function GetData()
{
try
{
$.ajax({
url: "http://phyzical.pythonanywhere.com/download_db/",
crossDomain: true,
dataType: 'text',
context: document.body,
error: reportError
}).done(processResponse);
}
catch(e)
{
dataBlock.textContent = "Request Error: " + e.message;
}
}
function reportError()
{
dataBlock.textContent = "Some kind of problem...";
}
function processResponse(data)
{
dataBlock.textContent = data;
var obj = JSON.parse(data);
/*Do all the things you need to do with your data here.*/
}
dataBlock.textContent = "Fetching data...";
GetData();
</script>
JSON数据获取测试
var-dataBlock=document.getElementById(“数据”);
函数GetData()
{
尝试
{
$.ajax({
url:“http://phyzical.pythonanywhere.com/download_db/",
跨域:是的,
数据类型:“文本”,
上下文:document.body,
错误:reportError
}).完成(处理响应);
}
捕获(e)
{
dataBlock.textContent=“请求错误:”+e.message;
}
}
函数reportError()
{
dataBlock.textContent=“某种问题…”;
}
函数processResponse(数据)
{
dataBlock.textContent=数据;
var obj=JSON.parse(数据);
/*在这里使用您的数据执行所有需要执行的操作*/
}
dataBlock.textContent=“获取数据…”;
GetData();
我还没有实现您的任何逻辑,但我已经重写了您的请求代码(因为这正是您遇到的问题),以使用jQuery的AJAX方法而不是Firefox的请求
<h1>JSON Data Fetch Test</h1>
<div id="data"></div>
<script src="jquery-2.0.3.min.js"></script>
<script>
var dataBlock = document.getElementById("data");
function GetData()
{
try
{
$.ajax({
url: "http://phyzical.pythonanywhere.com/download_db/",
crossDomain: true,
dataType: 'text',
context: document.body,
error: reportError
}).done(processResponse);
}
catch(e)
{
dataBlock.textContent = "Request Error: " + e.message;
}
}
function reportError()
{
dataBlock.textContent = "Some kind of problem...";
}
function processResponse(data)
{
dataBlock.textContent = data;
var obj = JSON.parse(data);
/*Do all the things you need to do with your data here.*/
}
dataBlock.textContent = "Fetching data...";
GetData();
</script>
JSON数据获取测试
var-dataBlock=document.getElementById(“数据”);
函数GetData()
{
尝试
{
$.ajax({
url:“http://phyzical.pythonanywhere.com/download_db/",
跨域:是的,
数据类型:“文本”,
上下文:document.body,
错误:reportError
}).完成(处理响应);
}
捕获(e)
{
dataBlock.textContent=“请求错误:”+e.message;
}
}
函数reportError()
{
dataBlock.textContent=“某种问题…”;
}
函数processResponse(数据)
{
dataBlock.textContent=数据;
var obj=JSON.parse(数据);
/*在这里使用您的数据执行所有需要执行的操作*/
}
dataBlock.textContent=“获取数据…”;
GetData();
你链接到那里的帖子-解释得非常清楚。你需要使用callback。你链接到那里的帖子-解释得非常清楚。你需要使用callback。这个解决方案的唯一问题是同样的问题仍然存在,因为程序的其余部分需要数据库信息来执行下一行代码。谢谢你的尝试。这个解决方案唯一的问题是同样的问题仍然存在,因为程序的其余部分需要数据库信息来执行下一行代码。谢谢你的尝试。这也是一个有效的答案,我最终解决了我的CORS问题,所以ajax调用可能会发生,请参阅millie的答案了解我最终使用的内容。这也是一个有效的答案,我最终解决了我的CORS问题,这样ajax调用就可以发生了,关于我最终使用的内容,请参见millie的答案。