如何在ajax调用结束后从ajax调用访问数据

时间:2017-03-30 05:24:04

标签: javascript jquery ajax

我正在进行ajax调用,从服务器返回一些数据。我在来自ajax调用的数据上处理字符串函数。根据我的知识,我可以看到字符串操作在ajax调用结束之前开始。经常给我未定义的错误。这是我的ajax电话

 $.ajax({

        type: "POST",
        url: "/add_director",
        headers: {'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')},
        data: formData,
        cache: false,
        contentType: false,
        processData: false,
        success: function(data) {
            $('#addDirModal').modal('hide');
            insertDirector(data); 
        },
        error : function(xhr ,status ,error)
        {
            console.log(xhr);
            alert(xhr);
        }
    });

这是我的insertDirector函数

function insertDirector(data){
      console.log(data);
      if (data.msg == "1") {
        $.each(data,function(key,value){
            var dir_name = value.dir_name;
            var dir_pan = value.dir_pan;
            var dir_din = value.dir_din;
            var dir_addr = value.dir_addr;
            var dir_id = value.id;
            var dir_img = value.dir_img;

              if (dir_name.val().length > 15) {
                var dir_r_name = dir_name.substr(0,15);
              }

              else{
                var dir_r_name = dir_name;
              }
         });
        }
       }

当我处理substr()时,它会抛出错误Cannot read property 'val' of undefined。我可以看到这是因为substr()在ajax请求完成之前执行。我该如何解决 ?

EDITED

以下是回复

{"msg":"1","director":{"dir_name":"Naveen","dir_pan":"AAAAA1111B","dir_din":"123456","dir_addr":"dsadasdasdasdsadasdas","dir_img":"1490852438.jpg","user_id":3,"updated_at":"2017-03-30 05:40:38","created_at":"2017-03-30 05:40:38","id":15}}

4 个答案:

答案 0 :(得分:0)

不清楚为什么你在这里使用$.each(你可以省略它并使用data.director而不是value),但如果你的数据有可能包含几个&#39 ;导演'对象并且您希望遍历所有对象,然后您应该更改insertDirector代码以跳过' msg'密钥,因为它没有dir_name, dir_plan, ...属性:

function insertDirector(data) {
  console.log(data);
  if (data.msg == "1") {
    $.each(data, function (key, value) {
      if (key == "director") { //or if (key != "msg")
        var dir_name = value.dir_name;
        var dir_pan = value.dir_pan;
        var dir_din = value.dir_din;
        var dir_addr = value.dir_addr;
        var dir_id = value.id;
        var dir_img = value.dir_img;

        var dir_r_name = (dir_name.length > 15 ? dir_name.substr(0, 15) : dir_name);
        //if (dir_name.length > 15) {
        //  var dir_r_name = dir_name.substr(0, 15);
        //}
        //else {
        //  var dir_r_name = dir_name;
        //}
      }
    });
  }
}

另请注意,dir_name.val().length错误,因为dir_name是一个字符串(.val()不是必需的)

答案 1 :(得分:0)

变化

if (dir_name.val().length > 15) {
  var dir_r_name = dir_name.substr(0,15);
}

if (dir_name.length > 15) {
  var dir_r_name = dir_name.substr(0,15);
}

答案 2 :(得分:0)

尝试这种方式:

function insertDirector(data) {
    console.log(data);
    if (data.msg == "1") {

        var dir_name = data.director.dir_name;
        var dir_pan = data.director.dir_pan;
        var dir_din = data.director.dir_din;
        var dir_addr = data.director.dir_addr;
        var dir_id = data.director.id;
        var dir_img = data.director.dir_img;

        if (dir_name.length > 15) {
            var dir_r_name = dir_name.substr(0, 15);
        }

        else {
            var dir_r_name = dir_name;
        }

    }
}

答案 3 :(得分:0)

看到您发布的数据后,很容易发现问题。 这里的问题是:

你的职能:

function insertDirector(data){
      console.log(data);
      if (data.msg == "1") {
        $.each(data,function(key,value){
            var dir_name = value.dir_name;
            var dir_pan = value.dir_pan;
            var dir_din = value.dir_din;
            var dir_addr = value.dir_addr;
            var dir_id = value.id;
            var dir_img = value.dir_img;

              if (dir_name.val().length > 15) {
                var dir_r_name = dir_name.substr(0,15);
              }

              else{
                var dir_r_name = dir_name;
              }
         });
        }
       }

这里,当你执行$ .each时,将遍历数据中的每个对象。现在,数据中的第一个值是msg:1。这不是一个对象。因此,在第一次迭代时,键是' msg'但价值是' 1' 。现在这个值不能有 dir_name,因此返回。因此,dir_name.val()会生成错误。

试试这样:

function insertDirector(data){
      console.log(data);
      if (data.msg == "1") {
        $.each(data,function(key,value){
            if(key==="director"){
            var dir_name = value.dir_name;
            var dir_pan = value.dir_pan;
            var dir_din = value.dir_din;
            var dir_addr = value.dir_addr;
            var dir_id = value.id;
            var dir_img = value.dir_img;

              if (dir_name.val().length > 15) {
                var dir_r_name = dir_name.substr(0,15);
              }

              else{
                var dir_r_name = dir_name;
              }
            }

         });
        }
       }