繁体   English   中英

React-Native——全局变量不变

[英]React-Native — Global variable not changing

我有两个单独的文件,第一个是一个组件 (List.js),它使用第二个 (APIService.js) 来获取不同的 API。 为了更正获取,URL 需要接收全局变量。 现在,我试图从 APIService 文件中的函数重新定义这些变量,但没有成功。 APIService.js变量在API calls注释之前被重新定义。

我有两个问题:

  • 为什么没有重新定义全局变量naptanId
  • 可以从组件定义和传递这些变量吗?

伪代码

  • 检测信标
  • 重新定义 naptanId
  • 使用最近定义的变量的组件获取 API
  • API调用完成
  • 数据传回组件
  • 设置状态

列表.js

componentDidMount() {
    // Executes first function
    APIService._fetchStopPoint((resp1) => {
        console.log("Stoppoint", resp1)
        // ... and set the bus state with the first response
        this.setState({
            bus: resp1
        });

        // ... based on the response, convert array to string
        const lines = (resp1.lines.map((line) => line.name)).toString()

        // ... pass lines to sencond function
        APIService._fetchArrivalTimes(lines, (resp2) => {
            // .. and set the tube state with the second response
            this.setState({
                isLoading: false,
                tube: resp2
            });
        });
    });
}

APIService.js

// Variables 
// ***********************************************************************
let naptanId = undefined
let lines = undefined

let ice = '59333'
let mint = '57011'
let blueberry = '27686'

let nearestBeacon = undefined;
let newBeaconId = undefined;

let setIce = false;
let setBlueberry = false;
let setMint = false;


// Beacon detection
// ***********************************************************************
const region = {
    identifier: 'Estimotes',
    uuid: '354A97D8-9CAF-0DC7-CE0E-02352EBE90CD',
};

// Request for authorization while the app is open
Beacons.requestWhenInUseAuthorization();
Beacons.startMonitoringForRegion(region);
Beacons.startRangingBeaconsInRegion(region);
Beacons.startUpdatingLocation();

// Listen for beacon changes
const subscription = DeviceEventEmitter.addListener('beaconsDidRange', (data) => {

    const ibeacons = data.beacons

    // var lowestAccuracySeen = 0.5;
    let lowestAccuracySeen = "immediate"

    // Check if beacons are updating
    if (ibeacons && ibeacons.length > 0) {
        // Loop through beacons array
        for (var i = 0; i < ibeacons.length ; i++) { 
            // Find beacons with same minor ...
            var foundBeacon = ibeacons.find(function(closestBeacon) {
                // ... and return the beacon the lowest accuracy seen
                // return closestBeacon.accuracy.toFixed(2) < lowestAccuracySeen;
                return closestBeacon.proximity == lowestAccuracySeen
            });
            // If found ...
            if (foundBeacon)    {
                // ... define the lowest accuracy and the nearest beacon
                lowestAccuracySeen = foundBeacon.accuracy;
                nearestBeacon = foundBeacon;

                // Identify what component to render against nearest beacon
                setIce = nearestBeacon.minor == ice ? true : false;
                setMint = nearestBeacon.minor == mint ? true : false;
                setBlueberry = nearestBeacon.minor == blueberry ? true : false;

                if (setIce) {

                    // THESE VARIABLES CANNOT BE REDEFINED
                    naptanId = "490004936E" 
                    lines = "55"

                } else if (setMint) {

                } else if (setBlueberry) {

                };
            }
        }
    }
});

// API calls 
// ***********************************************************************
class APIService {


    // Fecth stop point info
    static _fetchStopPoint(cb) {
        console.log(naptanId, lines)


        fetch(`https://api.tfl.gov.uk/StopPoint/${naptanId}`)
            .then(stopData => {
                try {
                    stopData = JSON.parse(stopData._bodyText); // Converts data to a readable format
                    cb(stopData, naptanId);
                } catch(e) {
                    cb(e);
                }
            })
            .catch(e => cb(e));
    }

    // Fetch arrival times info
    static _fetchArrivalTimes(lines, cb) {

        fetch(`https://api.tfl.gov.uk/Line/${lines}/Arrivals/${naptanId}`)
            .then(arrivalData => {
                try {
                    arrivalData = JSON.parse(arrivalData._bodyText);
                    arrivalTime = arrivalData
                    cb(arrivalData);
                } catch(e) {
                    cb(e);
                }
            })
            .catch(e => cb(e));
    }

    // Fetch status info
    static _fetchStatus(lines) {

        fetch(`https://api-argon.digital.tfl.gov.uk/Line/${lines}/Status`)
            .then(statusData => {
                try {
                    statusData = JSON.parse(statusData._bodyText); // Converts data to a readable format
                    cb(statusData);
                } catch(e) {
                    cb(e);
                }
            })
            .catch(e => cb(e));
    }

}

module.exports = APIService;

处理这些全局变量(跨不同组件)的最简单方法是使用AsyncStorage

let response = await AsyncStorage.getItem('listOfTasks');  //get, in any components
AsyncStorage.setItem('listOfTasks', 'I like to save it.'); //set, in any components

对于性能更重要的全局变量,您还可以考虑Realm Database (如 iOS 和 Android 中的 CoreData、SQLite)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM