如何从ajax成功事件返回多个值

时间:2016-01-07 15:59:06

标签: javascript ajax

我有两个js文件,即myJs1.js和myJs2.js。 从myJs1.js调用myJs2.js的方法。

我想将r1r2返回到结果中(在myJs1.js中)

我试过这个: 我在ajax调用之前声明了r1r2变量 在ajax电话之后我添加了:

return [r1,r2];

但它将r1r2作为undefined返回。 当我研究这个问题时,我发现添加async: false可能有用,但它有很多问题(比如浏览器冻结)。即便如此我尝试了它仍然无法获得r1和r2的值。

注意:我是第一次使用AJAX,所以记住这一点。

编辑:在Js1中有一个ajax调用,在成功事件中调用该方法。我想访问结果来调用js1

中的另一个方法

编辑:在这里查看代码

myJS1:

function method() 
{

$.ajax({ 
    type: "GET",
    dataType: "json",
    url: "http://127.0.0.1:8000/***/***",
    success: function(response){
        result=methodOfmyJs2(response);
        load1(r1); //r1 from result
        load2(r2); //r2 from result
    }
})

}

myJs2:

function methodOfmyJs2(data)
{
    $.ajax({ 
    type: "GET",
    data:SomeData,
    dataType: "json",
    url: "http://127.0.0.1:8000/***/***",
    success: function(response){
      r1=anotherMethodFromThisJS1(response);
      r2=anotherMethodFromThisJS2(response); 
      result=[r1,r2]
    }
})

}

我需要访问r1和r2的值来调用myJs1的load1和load2方法。

3 个答案:

答案 0 :(得分:2)

您可以改为使用回调。

[编辑]

myJS1:

function method () {
    $.ajax({ 
        type: "GET",
        dataType: "json",
        url: "http://127.0.0.1:8000/***/***",
        success: function (response) {
            methodOfmyJS2(function (r1, r2) {
                load1(r1);
                load2(r2);
            });
        }
    });
}

myJS2:

methodOfmyJs2 (callback) {
    $.ajax({
        type: "GET",
        data: somedata,
        dataType: "json",
        url: "http://127.0.0.1:8000/****/****",
        success: function (response) {
            var r1 = anotherMethodFromThisJS1(response);
            var r2 = anotherMethodFromThisJS2(response);

            callback(r1, r2);
    });
}

答案 1 :(得分:2)

默认情况下,Ajax调用是asynchronous,这意味着ajax调用函数jQuery.ajax()不会等待HTTP响应在返回之前返回。

要在HTTP响应到达后获取数据,我们必须提供一个回调,即success函数。如果你想在另一个函数中获取这个数据,只需在success回调函数中调用该函数。

以下是代码:

//JS1.
function processResponse(r1, r2) {
    // do processing here with r1 and r2
}

//JS2.
function methodOfmyJs2()
{
     $.ajax({ 
        type: "GET",
        data:somedata,
        dataType: "json",
        url: "http://127.0.0.1:8000/****/****",
        success: function(response){
            r1=anotherMethodFromThisJS1(response);
            r2=anotherMethodFromThisJS2(response); 

            //calling the success callback
            processResponse(r1, r1);
        }  
    }); 
}

如果您真的想要这样做,还有另一种选择,您可以像下面那样进行Ajax调用synchronous

$.ajax({
    type: "GET",
    url: remote_url,
    async: false,//now call is synchronous
    success : function (data) {
    }
});

现在jQuery.ajax()将等待HTTP响应到达,然后您可以从[r1, r2]返回methodOfmyJs2()

但是你应该避免进行同步调用,因为它会让JS线程等待冻结UI。

答案 2 :(得分:0)

$.ajax返回promise,可以与then

链接
function getAjaxOutput() {
    request1().then(function(data){
      // get data from request 1 and pass to request 2
      return request2(data);        
    })
  .then(function(data){
   // get data from request2
    $('#output').text(JSON.stringify(data));
  })
    return false;
}
试试吧 https://jsfiddle.net/je7wf4ww/

如果你想从getAjaxOutput返回普通结果 - 你根本就不能(当然没有进行请求同步) - 你需要返回promise,这是一个围绕ajax调用的包装,并用{{1}再次链接它}}