"push()"到Typescript中的数组

"push()" to an array in Typescript

本文关键字:quot 数组 Typescript push      更新时间:2023-09-26

我有以下代码,用于扫描蓝牙设备,对于找到的每一个设备,我都想将该设备添加到阵列中。

devices: Observable<Array<string>>;
bluetoothAdd() {
    this.isScanning = true;
    var plusIcon = this.page.getViewById("add");
    plusIcon.style.opacity = 0;
    var self = this; 
    bluetooth.hasCoarseLocationPermission().then(
        function (granted) {
            if (!granted) {
                bluetooth.requestCoarseLocationPermission();
            } else {
                bluetooth.startScanning({
                    serviceUUIDs: ["133d"],
                    seconds: 4,
                    onDiscovered: function (peripheral) {
                        console.log("Periperhal found with UUID: " + peripheral.UUID);
                        this.devices.push(peripheral); // <- Problem Line
                    }
                }).then(function () {
                    console.log("scanning complete");
                    self.isScanning = false;
                    plusIcon.style.opacity = 1;
                }, function (err) {
                    console.log("error while scanning: " + err);
                });
                this.isScanning = false;
            }
        });
}

但是,此代码会引发以下错误:

JavaScript错误:file:///app/Pages/Home/home.component.js:99:37:JS ERROR TypeError:undefined不是对象(正在评估"this.devices.push")

我在Typescript中工作,但我知道push函数是JS的东西。不知道我会如何在打字中做到这一点——我做错了什么?

它与TypeScript无关,它只是this的普通Javascript规则。

问题this指向您赋予onDiscovered的函数,而不是类。

您可以使用您定义的self变量来修复它,或者重写代码以使用箭头函数,如下所示:

devices: Observable<Array<string>>;
bluetoothAdd() {
    this.isScanning = true;
    var plusIcon = this.page.getViewById("add");
    plusIcon.style.opacity = 0;

    bluetooth.hasCoarseLocationPermission().then(
        (granted) => {
            if (!granted) {
                bluetooth.requestCoarseLocationPermission();
            } else {
                bluetooth.startScanning({
                    serviceUUIDs: ["133d"],
                    seconds: 4,
                    onDiscovered: (peripheral) => {
                        console.log("Periperhal found with UUID: " + peripheral.UUID);
                        this.devices.push(peripheral); // <- Problem Line
                    }
                }).then(() => {
                    console.log("scanning complete");
                    this.isScanning = false;
                    plusIcon.style.opacity = 1;
                }, (err) => {
                    console.log("error while scanning: " + err);
                });
                this.isScanning = false;
            }
        });
}

此外,正如Bhabishya所指出的,这种类型的设备是可观测的。该类型上没有定义push方法。相反,它将能够发射一个设备数组。

如果您只需要一个数组,那么还应该将设备更改为字符串数组,而不是字符串数组的Observable。

devices: Array<string>;

你还必须初始化它。

devices: Array<string> = [];

您已经将设备定义为数组devices: Observable<Array<string>>的Observable,而不是可以在其上调用push()函数的数组devices: Array<string>