NDEFReader.write 忽略中止信号

Posted

技术标签:

【中文标题】NDEFReader.write 忽略中止信号【英文标题】:NDEFReader.write ignoring the abort signal 【发布时间】:2021-06-23 10:50:30 【问题描述】:

我正在尝试创建一个可以读取和写入 NFC 标签的简单网页。如果需要,我还希望具有取消写入操作的功能。所以我遵循了here 和here 的例子。但是,我遇到了一个中止信号被忽略的问题。这个简单的代码可以说明问题:

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Test</title>

    <script>
        let data;
        let reset_controller = new AbortController();
        let ndef;


        try 
            ndef = new window.NDEFReader();

            ndef.addEventListener("readingerror", async () => 
                log_error('Cannot read data from the NFC tag.');
            );

            ndef.addEventListener("reading", async (message, serialNumber) => 
                data = new TextDecoder('utf-8').decode(message.records[0].data.buffer);
                draw_info();
            );
         catch (error) 
            console.error(error);
        

        function draw_info() 
            document.getElementById('data').innerHTML = `data is: $data`;
        


        function reset() 
            console.log('Aborted!')
            reset_controller.abort();
            document.getElementById('data').innerHTML = '';
        


        async function read_data() 
            data = await ndef.scan();
            draw_info();
        

        async function write_data() 
            console.log('stating write')
            try 
                await ndef.write("some data", 
                    AbortSignal: reset_controller.signal
                );
             catch (e) 
                console.error(e);
            
        
    </script>

</head>
<body>
<button onclick="read_data()">Read</button>
<button onclick="write_data()">Write</button>
<button onclick="reset()">Rest</button>
<p id="data">data is: </p>
</body>
</html>

重复问题:

1- 点击写入按钮。

2-点击reset取消写入。

    接近标签。

标签现在在不应该包含字符串“一些数据”的地方

【问题讨论】:

【参考方案1】:

好的,我找到了问题。

当我们将选项对象传递给 write 函数时,中止信号应放置在 'signal' 属性而不是 'AbortSignal'

【讨论】:

【参考方案2】:

的确如此。选项字典的键应该是signal,而不是AbortSignal。查看代码示例https://web.dev/nfc/#abort-nfc-operations

const abortController = new AbortController();
abortController.signal.onabort = event => 
  // All NFC operations have been aborted.
;

const ndef = new NDEFReader();
await ndef.scan( signal: abortController.signal );

await ndef.write("Hello world",  signal: abortController.signal );

document.querySelector("#abortButton").onclick = event => 
  abortController.abort();
;

【讨论】:

以上是关于NDEFReader.write 忽略中止信号的主要内容,如果未能解决你的问题,请参考以下文章

nohup命令详解

中止信号的一般原因是啥?

Jquery Ajax 错误处理忽略中止

InternalError:当前事务被中止,命令被忽略直到事务块结束

DatabaseError:当前事务被中止,在事务块结束之前忽略命令?

错误:当前事务被中止,在创建新记录时忽略命令直到事务块结束