反应原生 — 全局变量不变



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

我有两个问题:

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

伪代码

  • 检测信标
  • 重新定义纳普坦ID
  • 使用最近定义的变量的组件提取 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 数据库(如 CoreData,iOS 和 Android 中的 SQLite(。

最新更新