开发者问题收集

React js:错误 TypeError - 无法读取未定义数组的属性

2020-01-30
135

在 API 请求后将船队的实时数据传递到表中之前,我想尝试注入样本数据,实际上我对它们进行了硬编码。目标是:如果我可以读取样本数据,那么 API 几乎肯定会将数据显示到我正在寻找的所有船只的表中。

但是调试器提示 ErrorTypeError - 无法正确读取未定义变量的属性 ,而 Console 提示:

Response { type: "opaque", url: "", redirected: false, status: 0, ok: false, statusText: "", headers: Headers, body: null, bodyUsed: false }

ErrorTypeError: 这是未定义的 ,如果有用的话,我还会附上我的桌面屏幕截图:

console

下面是我使用的代码:

import React, { Component } from 'react';
import styled from 'styled-components';
import GoogleMapReact from 'google-map-react';

const resultArea = document.getElementById('result');
let out = '';

const fetchConfig = {
    method: 'GET',
    mode: 'no-cors'
};

const MapContainer = styled.div`
    // some components
`;

class BoatMap extends Component {
    constructor(props) {
        super(props);
        this.state = {
            buttonEnabled: true
        };
        this.updateRequest = this.updateRequest.bind(this);
    }

    updateRequest() {
        const url =
            'http://data.aishub.net/ws.php?username=My_KEY&format=1&output=json&compress=3&latmin=12.11&latmax=48.95&lonmin=-124.97&lonmax=-58.95';
        console.log(url);
        fetch(url, fetchConfig)
            .then(function(data) {
                console.log(data);
                return this.dummyData; // <-- Can't read this 
            })
            .then(function(jsonObject) {
                const boatData = JSON.parse(jsonObject);
                 for (boat in jsonObject) {
                    const boatInfo = [
                        // parsing data from the API after confirming with hardcoded dummyData
                     ];
                    boatOut(boatInfo);
                    console.log(boatInfo);
                 }
                resultArea.innerHTML = out;
            })
            .catch(function(e) {
                console.log('Error' + e);
            });
        this.setState({
            buttonEnabled: false
        });
        setTimeout(() => {
            this.setState({ buttonEnabled: true });
        });
    }

    dummyData = [
        {
            ERROR: false,
            USERNAME: 'My_KEY',
            FORMAT: 'HUMAN',
            LATITUDE_MIN: 20.5,
            LATITUDE_MAX: 30.8,
            LONGITUDE_MIN: -15,
            LONGITUDE_MAX: 18.6,
            RECORDS: 14
        },
        [
            {
                MMSI: 566619000,
                TIME: '2020-01-25 19:51:38 GMT',
                LONGITUDE: -14.84344,
                LATITUDE: 28.282,
                COG: 15.7,
                SOG: 11.3,
                HEADING: 16,
                ROT: 0,
                NAVSTAT: 0,
                IMO: 9529504,
                NAME: 'NORD SUMMIT',
                CALLSIGN: 'S6RW5',
                TYPE: 70,
                A: 174,
                B: 26,
                C: 20,
                D: 12,
                DRAUGHT: 12.1,
                DEST: 'NO SAU',
                ETA: '02-02 12:00'
            },
            {
                MMSI: 236446000,
                TIME: '2020-01-25 19:51:28 GMT',
                LONGITUDE: -14.83202,
                LATITUDE: 28.64639,
                COG: 38,
                SOG: 12.1,
                HEADING: 38,
                ROT: 3,
                NAVSTAT: 0,
                IMO: 9291561,
                NAME: 'KEY BAY',
                CALLSIGN: 'ZDIJ4',
                TYPE: 83,
                A: 82,
                B: 18,
                C: 1,
                D: 19,
                DRAUGHT: 6.1,
                DEST: 'CASABLANCA',
                ETA: '01-27 15:00'
            }
        ]
    ];

    render() {
        return (
            <div className="google-map">
                <GoogleMapReact
                    bootstrapURLKeys={{ key: 'My_KEY' }}
                    center={{
                        lat: 42.4,
                        lng: -71.1
                    }}
                    zoom={11}
                    <button className="btn-next-request" onClick={() => this.updateRequest()}>
                        Time to Next API Request
                    </button>
                </GoogleMapReact>
            </div>
        );
    }
}

我目前所做的:

1) 我尝试直接在 dummyDaya 组件上解决问题,尝试手动解析它。但是 API 已经给出了我在 updateRequest() 函数中包含的模板文件作为答案。什么都没显示。

2) 我不确定为什么我无法读取两个容器的数据,因为我复制/粘贴了这两个数据的 API 答案。从技术上讲,应该可以毫无问题地注入。

3) 我现在正在尝试调查根据 官方文档 dummyData 在传递数据时不应携带(并且不知道是否应该擦除)请求的初始值的可能性。我指的是 dummyData 数组的以下部分:

dummyData = [
            {
                ERROR: false,
                USERNAME: 'My_KEY',
                FORMAT: 'HUMAN',
                LATITUDE_MIN: 20.5,
                LATITUDE_MAX: 30.8,
                LONGITUDE_MIN: -15,
                LONGITUDE_MAX: 18.6,
                RECORDS: 14
            },
[ …...

感谢您指出解决此问题的正确方向。

3个回答

使用 arrow 函数访问 this 作为组件引用/实例。 function 有自己的 this,这会产生误导

fetch(url, fetchConfig)
    .then((data) => {
        console.log(data);
        return this.dummyData; // <-- Can't read this 
    })

同样适用于此处代码中的所有此类函数

Zohaib Ijaz
2020-01-30

首先,如果您希望通过 fetch 返回响应,则需要调用 Body.json() 来返回 Response 流。

fetch(url, fetchConfig)
  .then((data) => {
     return data.json();
  }).then((data) => {
     console.log(data);
     // do the rest here
  }); 

接下来,如果您希望引用 this ,则需要使用箭头函数,

fetch(url, fetchConfig)
  .then((data) => {
    return this.dummyData;
  }).then((data) => {
     console.log(data);
     // do the rest here
  }); 
wentjun
2020-01-30

为 dummyData 创建状态。

constructor(props) {
   super(props);
   this.state = {
     buttonEnabled: true,
     dummyData : [],   // Create state for dummyData
   };
this.updateRequest = this.updateRequest.bind(this);
}

然后从您的 url 获取数据(我使用了 async await )并将其设置为 dummyData。

const request = async () => {
         const url = 'http://data.aishub.net/ws.php? username=My_KEY&format=1&output=json&compress=3&latmin=12.11&latmax=48.95&lonmin=-124.97&l onmax=-58.95';

         const response = await fetch(url, fetchConfig);
         const json = await response.json();
         this.setState(dummyData : json);
    }        

    request();
Qui-Gon Jinn
2020-01-30