使用 try...catch 包裹调用 web nfc api 的 async 函数,即可捕获其抛出的异步错误。web nfc 的 ndefreader 对象提供 scan() 和 write() 方法,它们返回 promise,当扫描被中断、写入失败或权限被拒绝时,promise 会 reject 并抛出错误,这些错误会被外层的 try...catch 正常捕获。

NDEFReader.scan() 在用户取消扫描时会抛出什么错误
NDEFReader.scan() 在用户通过浏览器 UI 取消扫描或设备失去连接时,会抛出 AbortError。这是一个 DOMException,其 name 属性为 "AbortError"。开发者可以通过检查错误的 name 属性来区分这是用户主动取消还是其他类型的硬件故障。

const reader = new NDEFReader();
async function startScanning() {
try {
await reader.scan();
console.log("扫描开始");
} catch (error) {
if (error.name === 'AbortError') {
console.log("用户取消了扫描");
} else {
console.error("扫描发生未知错误:", error);
}
}
}
startScanning();
NDEFReader.write() 在写入非 NDEF 标签时如何处理异常
当尝试向不支持 NDEF 格式的标签写入数据时,NDEFReader.write() 会抛出 DOMException,通常名为 "NotReadableError" 或 "UnknownError"。这是因为底层硬件无法将数据写入该特定标签。代码中应捕获此类异常并提示用户更换标签或检查标签兼容性。

const reader = new NDEFReader();
async function writeMessage() {
const record = {
recordType: 'text',
data: 'Hello World'
};
try {
await reader.write(record);
console.log("写入成功");
} catch (error) {
console.error("写入失败:", error.message);
}
}
writeMessage();
基于 reader.scan() 返回的 Promise 状态的具体问题
reader.scan() 返回的 Promise 在扫描期间保持 pending 状态,直到有 NFC 标签被检测到或操作被中止。如果未检测到标签且未超时,它将永远处于 pending 状态,不会自动 resolve 或 reject。因此,必须依靠用户交互(如点击取消按钮)或显式调用 reader.abort() 来改变其状态,否则程序会挂起等待。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











