未捕获的TypeError:无法读取属性'成功'未定义的

时间:2014-10-09 20:14:42

标签: javascript ajax

为什么这里的选项未定义?从这个ajax调用填充DisplayThisArr然后我转到另一个函数并对另一个api进行另一个ajax调用并使用一些数据将另一个属性添加到DisplayThisArr然后我想显示修改DisplayThisArr但由于某种原因,我得到Uncaught TypeError: Cannot read property 'success' of undefined

更深入了解here到完整的问题

dataSource: new kendo.data.DataSource({
    schema: {
        model: {
            1: { type: "string" },.
            2: { type: "string" },
            3: { type: "string" },
            4: { type: "string" },
            5: { type: "string" },
            6: { type: "string" },
            7: { type: "string" },
            propertyImAdding: { type: "number" },
        }
    },
    batch: true,
    transport: {
        read:
            function(options) {

            $.ajax({
              url: 'https://localhost:port/api/blah/blah',
              dataType: 'json',
              async: false,
              data: data,
              success: function(json) {
                    DisplayThisArr = json;
                    vM.getOtherData(); //Get another [] of json objects from another api and mod DisplayThisArr
                    options.success(DisplayThisArr); //Display the modified DisplayThisArr array
              }
            });//end ajax
        }//end function(options)
    }
})//End datasource

2 个答案:

答案 0 :(得分:1)

success不是options的属性。根据您似乎想要做的事情,您需要有一个单独的函数来显示数组的内容,并在每个ajax成功处理程序中调用它。

您将async设置为false这一事实表明您对ajax的工作方式缺乏了解。 success是一个回调函数,当资源从服务器返回时,无论何时发生,都会执行该函数。如果您需要向服务器发出多个请求(很少但可能),那么最好的'实现这一目标的方法是将第二个ajax调用放在第一个成功处理程序中:

$.ajax({
    url: 'myscript.php',
    success: function(resp) {
        //do stuff to the array based on response
        $.ajax({
            url: 'otherscirpt.php',
            success: function(data) {
                //do more stuff based on other response
                display(myArray);
            }
        });
    }
});

如果你可以在一个独家新闻中获取所有数据,它真的是最好的,但是有时服务器上的内存限制会超出你的控制范围会强制它,有时候数据需要按顺序排列,但是你可以这样做以上链接回调,而不是将async设置为false

答案 1 :(得分:0)

它没有被定义,因为它可能(可能不是,这对于this变量的内容来说是典型的),超出了函数success的范围。试试这种方式

function(options) {
    var optns = options;
    $.ajax({
      url: 'https://localhost:port/api/blah/blah',
      dataType: 'json',
      async: false,
      data: data,
      success: function(json) {
            DisplayThisArr = json;
            vM.getOtherData(); 
            optns.success(DisplayThisArr);
      }
    });//end ajax
}//end function(options)

或者您未在函数options

的调用中提交read