我目前正在开发一个简单的应用程序,用户可以扫描NFC标签,并在屏幕上接收存储在标签上的数据。
我遵循了这个例子,当我尝试验证一个扇区并读取&但是当我试图同时从两个扇区读取数据时;超越性失败";错误
我正在使用Mifare 1k卡在三星J6设备上测试该应用程序。
这是我的代码:
this.state = {
keyAorB: KeyTypes[1], // 'B'
keyToUse: 'FFFFFFFFFFFF',
sectors: [3, 4],
...
};
authenticateSector = (sector) => {
// Convert the key to a UInt8Array
const key = [];
for (let i = 0; i < this.state.keyToUse.length - 1; i += 2) {
key.push(parseInt(this.state.keyToUse.substring(i, i + 2), 16));
}
if (this.state.keyAorB === KeyTypes[0]) {
return NfcManager.mifareClassicAuthenticateA(sector, key);
} else {
return NfcManager.mifareClassicAuthenticateB(sector, key);
}
};
read = (sector) => {
return NfcManager.mifareClassicGetBlockCountInSector(sector)
.then(() => NfcManager.mifareClassicReadSector(sector))
.then((tag) => {
...
})
.then(() => NfcManager.mifareClassiacSectorToBlock(sector))
.then(block => NfcManager.mifareClassicReadBlock(block))
.catch((err) => console.warn(err))
};
readBulk = () => {
this.state.sectors.forEach(async (s) => {
const sector = parseInt(s);
await this.authenticateSector(sector)
.then(() => this.read(sector))
.then(() => this.cleanUp())
.catch((err) => console.warn(err));
});
}
调试后,我发现了问题所在,即:据我所知,一个扇区必须经过身份验证,然后从中读取,但在我的情况下,两个扇区都经过了身份验证,随后为它们调用了读取函数,但这并不起作用。
我的问题是:为什么会发生这种情况?我的代码不应该以一种对扇区进行身份验证(返回Promise(,然后从中读取数据并在之后进行清理的方式工作吗?
感谢您的帮助!:(
.forEach()
不等待异步回调(请参阅本文(,因此readBulk
函数实际上是在所有扇区上同时调用this.read()
,而不等待清理。forEach
只是运行并为this.sectors
中的所有元素发出回调。
要在继续之前等待每个auth/read/cleanUp周期,您可以这样重构它:
readBulk = async () => {
for (const s of this.state.sectors) {
const sector = parseInt(s)
try {
await this.authenticateSector(sector)
await this.read(sector)
await this.cleanUp()
} catch (err) {
console.warn(err)
}
}
}