在继续之前确保已完成异步GET / POST请求

时间:2013-11-20 16:59:37

标签: javascript post get firefox-addon firefox-addon-sdk

嘿伙计们在过去的几个小时里一直试图解决这个问题并决定在我睡觉之前把它扔到这里,无论如何问题是我需要确保GET / POST请求是100%处理的在继续通过代码之前,我通过firefox addon sdk的计时器解决了这个问题,但因为这是java脚本它锁定了ui,所以我一直在寻找解决方案,我偶然发现了Felix Kling的潜在解决方案,“ How do I return the response from an asynchronous call?”。虽然我尝试了没有成功,所以我想知道是否有人可以告诉我我做错了什么,或者我甚至不能使用这个解决方案我想做什么。

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;
}
遗憾的是,regexArray.length记录“0”后跟GET中的“OK”,然后其中一个捕获触发,所以我知道信息存储在数组中只是因为我开始的相同问题仍然存在。

任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:4)

如果在继续之前需要回复,那么您确实有两个选择:一个是将响应传递给AJAX响应处理程序中的回调。回调将是应用程序在收到响应后继续的入口点。

另一种选择是使用同步XHR请求。但是,这种方法的缺点是,在请求完成之前,您的UI将被锁定。

干杯

答案 1 :(得分:1)

Addon SDK的promise module可让您以优雅的方式完成所需的工作。

答案 2 :(得分:1)

我没有实现你的任何逻辑,但我已经重写了你的请求代码(因为那是你遇到的麻烦)使用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>

答案 3 :(得分:0)

目前我无法回答大部分代码,但是当我遇到这类问题时,我通常最终会在Get的onComplete中调用“next”函数(在你的情况下为download_status()),或者硬编码或回调。这将确保它在完成后被调用。