Javascript 确保异步GET/POST请求已完成,然后继续

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

嘿,伙计们,在过去的几个小时里,我一直在试图解决这个问题,我决定在睡觉前把它扔到这里,不管怎样,问题是我需要确保GET/POST请求在继续执行代码之前得到100%的处理,我用firefox插件sdk中的计时器破解了这个问题,但因为这是java脚本,它锁定了ui,所以我一直在寻找解决方案,我偶然发现了Felix Kling的潜在解决方案。虽然我尝试过,但没有成功,所以我想知道是否有人能告诉我我做错了什么,或者我甚至不能用这个解决方案来完成我想做的事情

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的答案。