返回ajax.done数据会给jquery带来错误

时间:2013-11-25 13:06:38

标签: javascript jquery ajax

我的ajax.done中有数据,并且它在jquery上有bug。 我用Google搜索,无法找到任何东西。

该怎么办?

function select_aragement(arragament){
  var arrst = arragament;
  var arrsplit = arrst.split("|");
  var periode = arrsplit[0];
  var id = arrsplit[1];
  var postsjson;
  var test= $.ajax({ 
    type: 'POST',
    async: true,
    url: 'ajax/prijzen.php',
    data: { id: id, periode: periode },
    dataType: 'json'
  }).done(function (vis) {
    console.log(vis);
    postsjson = $.parseJSON(vis);
  });
  return  postsjson;
}

5 个答案:

答案 0 :(得分:1)

您不应该尝试从回调函数返回任何内容,因为返回的值不会有任何意义。相反,您只需使用来自该回调函数内的AJAX请求的响应。

假设你有这段代码:

function bar() {
var myObject = foo();

// do something with myObject
}

function foo() {
    var bar; // 1

    var xhr = $.ajax({
        url: yourUrl,
        dataType: 'json',
        type: 'post',
        data: {
            some: 'data'
        }
    }); // 2

    xhr.done(function(yourObject) {
        bar = yourObject; // 5
    }); // 3

    return bar; // 4
}

bar();

foo函数内的注释表示这些语句的执行顺序。因此,您声明一个变量bar,声明一个具有Deferred对象的变量xhr,使用回调函数为其附加done处理程序,返回值bar然后 bar的值已设置(太迟了 - 您已经尝试将其返回)。

执行bar函数myObject的内部将是未定义的,因为bar函数中foo的值未在返回之前设置声明。您需要做的只是将// do something with myObject代码移动到回调函数,然后在那里使用bar

function foo() {
    var xhr = $.ajax({
        url: yourUrl,
        dataType: 'json',
        type: 'post',
        data: {
            some: 'data'
        }
    }); // 1

    xhr.done(function(yourObject) {
        var bar = yourObject; // 4
        // do something with bar
    }); // 2

    // 3 - function execution has finished
}

答案 1 :(得分:0)

您可能希望在完成部分内移动返回行

}).done(function (vis) {
     console.log(vis);
     postsjson = $.parseJSON(vis);
     return  postsjson;
});

但请记住,作为一个异步电话,你的回归也是如此。我的建议是通过回调。

function select_aragement(arragament, callback){
    var arrst = arragament;
    var arrsplit = arrst.split("|");
    var periode = arrsplit[0];
    var id = arrsplit[1];
    var postsjson;
    var test= $.ajax({ 
         type: 'POST',
         async: true,
         url: 'ajax/prijzen.php',
         data: { id: id, periode: periode },
         dataType: 'json'
     });
   test.done(function (vis) {
      console.log(vis);
     postsjson = $.parseJSON(vis);
     callback && callback(postjson);
    });
}

修改代码以使用回调而不是返回的值。

var postjson=select_aragement(arragament);
...stuff with postjson...

 select_aragement(arragament, function(postjson) {
    ...stuff with postjson...
});

答案 2 :(得分:0)

您正在尝试同步进行ajax调用,因为您需要将async属性设置为false。

async: false,

答案 3 :(得分:0)

问题:

请查看以下代码:

function getValue(){
    var value = 0;
    setTimeout(function(){
        value = 42;
    }, 1000);

    return value;
}

返回的值是多少?

fiddle

这是你完全相同的问题
 function select_aragement(arragament){
      var postjson;
      $.ajax(...).done(function(vis){ 
         postjson = vis;
      });

      return postjson;
 }

解决方案:

我想你以下列方式使用你的功能:

var data = select_aragement(arragament);
// do something with data :
$.each(data, function(){
    ....
});

您可以像这样更改select_aragement的代码:

function select_aragement(arragament){
  var arrst = arragament;
  var arrsplit = arrst.split("|");
  var periode = arrsplit[0];
  var id = arrsplit[1];
  var test = $.ajax({ 
      type: 'POST',
      async: true,
      url: 'ajax/prijzen.php',
      data: { id: id, periode: periode },
     dataType: 'json'
  });
  // return the promise which wraps the ajax call
  return test;
}

和这样的调用代码:

// "p" stands for "promise"
var p = function select_aragement(arragament);
p.done(function(data){
    // do something with data :
    $.each(data, function(){
        ....
    });
});

或没有局部变量:

select_aragement(arragament).done(function(data){
    // do something with data :
    $.each(data, function(){
        ....
    });
});

答案 4 :(得分:0)

在这种情况下,您可以像这样从jQuery使用async / await混合到.done:

async function myasyncfunction(myArgs){
    
    var response = [];

    var req = $.ajax({
        method: "GET",
        url: resquestURL,
        dataType: "json",
    })
    
    await req.done( res => {
        //DO some stuff with your data
           
        for (let index = 0; index < res.length; index++) {
            const element = res[index];
            response .push( "some stuff" + element );
        }
    })
    
    return response;
}