一系列需要彼此结果的AJAX调用

时间:2014-01-29 17:18:20

标签: javascript php jquery ajax cordova

我正在向服务器发出一个ajax调用,该服务器返回一些我存储在localStorage项目中的数据(不需要解释原因,但需要像那样)。

然后我需要在第一个ajax调用之后立即恢复该localStorage项目。

我的问题:同步,第二次调用在变量设置之前开始,所以我得到了空。

我尝试了#34;当他们在#34;," when.then"时,在第一次成功时调用了第二个......似乎没有任何效果。

3 个答案:

答案 0 :(得分:5)

顺序ajax调用。

在您的情况下,最好的解决方案可能是使用顺序的ajax调用。

编辑:我现在看到了jquery标签..这段代码是纯粹的javascript ..适用于所有现代浏览器,包括ie10& IOS / Android的。它被称为xhr2。但是当你使用localStorage时,这应该不是问题。

function ajax(a,b,c){ // Url, Callback, just a placeholder
 c=new XMLHttpRequest;
 c.open('GET',a);
 c.onload=b;
 c.send()
}

function store(array){
 window.localStorage['data']=JSON.stringify(array)
}

//***************************************************************

function firstCheck(){
 var call1data=JSON.parse(this.response);
 store(call1data);
 // get what you need
 ajax('url',secondCheck)
}

function secondCheck(){
 var 
 call2data=JSON.parse(this.response),
 call1data=JSON.parse(window.localStorage['data']);
 // whatever...
}

ajax('url',firstCheck);

现在,如果你更具体......我可以详细说明代码。


更多信息以及正在使用的ajax功能。还有一个帖子的例子。

https://stackoverflow.com/a/18309057/2450730

如果您有任何问题,请询问。

答案 1 :(得分:2)

您需要在第一次调用返回时使用回调。

使用$ .ajax有两种方式:

第一种方式:

$.ajax({
    type: "GET",
    url: url,
    data: data,
    success: function (data){
        //store your localStorage item (data)

        //do another call when the first call is successful
        $.ajax({
            type: "GET",
            url: url,
            data: data,
            success: function (data){
                //restore your localStorage item
            }
        });
    }
});

第二种方式:

$.ajax({
    type: "GET",
    url: url,
    data: data,
    success: mySuccessFunction
});

function mySuccessFunction(data){
    //store your localStorage item (data)

    //do another call when this call is successful
    $.ajax({
        type: "GET",
        url: url,
        data: data,
        success: function (data){
            //restore your localStorage item
        }
    });
}

或者,如果您更喜欢使用$ .get:

的更快/更短的方式
$.get( "url", mySuccessFunction);

function mySuccessFunction(data){
    //store localStorage item

    $.get( "url", function(data){
        //restore localStorage item
    });
}

答案 2 :(得分:1)

我假设您在setTimeout类似循环中调用此ajax函数?

如果,你不希望ajax是异步的,那就是:

的第三个参数
ajax=new XMLHttpRequest();
ajax.open("GET","something.php",true); 

将模式设置为异步或不同步。

更好的解决方案是在状态变化时获取ajax,以便在其finsihed时调用新的ajax调用。

   ajax.onreadystatechange=function(){
       if (ajax.readyState==4 && ajax.status==200)
       {
           callMyAjaxFunctionAgain(ajax.response);
       }
   }