2017-09-25 57 views
0

对不起,这个愚蠢的问题,但对我的生活,我不能得到这个权利和一点点noob。即时得到一个前端JavaScript错误:未定义的数组长度检查

类型错误:无法读取的特性 '数据' 未定义

我的代码:

var getApiPipe = services.pipecall(_this.getPackage).success(function (data) { 
       if (data.response[0].data.length > 0) { 
        _this.buyerObjectResponse = data.response[0].data; 
       } else { 
        _this.noDataBuyer = true; 
       } 
       _thisRoot.loading = false; 
      }); 

的JSON回报是从服务器回来:

{ 
    "status":true, 
    "response":[ 
     { 
     "data":[ 
      { 
       "ID":1, 
       "auctionid":4, 
       "sessionname":"Session 1", 
       "created":"2017-09-25 10:13:57" 
      } 
     ] 
     } 
    ] 
} 

请帮忙:(

+1

使用你的调试器来找出为什么它是'undefined'和你实际上在找什么。 – SLaks

+1

我的猜测是'data'可能是一个String – CollinD

+0

由于错误提示“无法读取属性'数据'的未定义,您需要检查”.data“,您需要检查此属性的父对象。似乎你无法得到data.response [0],可能问题出在你的“数据”参数上,不知何故,成功回调不能获得数据参数的值。 –

回答

1

首先要做的第一件事,确保你是e接收您期望的响应类型!

之后,在可能未定义的嵌套属性看时,你可以做一对夫妇的事情,但最容易让大多数人理解的是Duck Casing

if(
    data && 
    data.response && 
    data.response.length && 
    data.response[0].data && 
    data.response[0].data.length 
) { 
    //do positive match here 
} else { 
    //no data 
} 

通过检查的这将是各部分一个积极的比赛,你可以确保它只会继续前进,如果每一块都在那里。

稍微慢一点,更通用的可能性是使用path函数,就像您在许多库中找到的一样。 Ramda有着相当不错的实现,但如果你不想使用Ramda,有香草JS版本:

function path (paths, object) { // will traverse the path, and if prop is found, returns it. 
    for(var i = 0, l = paths.length, intermediate = true; i < l && intermediate; i++){ 
    intermediate = object[paths[i]]; 
    } 
    return intermediate !== undefined? intermediate : null; 
} 

该函数将接受任何处于Object相关prop,包括数组数索引。