javascript - 承诺冻结浏览器直到 .then 被调用
问题描述
this.testfunction = function (file) {
var bufferPromise = new Response(file).arrayBuffer();
bufferPromise.then(function (buffer) {
//do stuff
});
};
我有一个方法需要从 File 对象中检索数据(https://developer.mozilla.org/en-US/docs/Web/API/File)
arrayBuffer() 创建一个承诺,然后我使用 then 基于该承诺执行我的其余代码。
不幸的是,在“then”被触发之前,我的浏览器冻结了。该方法已结束,但在承诺通过之前,我仍然无法按下任何其他按钮。为什么?
编辑:
<input id="files" class="hidden" type="file" data-bind="event: { change: function() { testfunction($element.files[0]) } }, click: $element.value=null;">
该方法由输入上的敲除绑定触发。该文件来自输入。
解决方案
我对Response
直接使用这样的作品感到有点惊讶。:-)
除了使用该Response
对象,您有几个选择:
在现代环境中,
File
对象本身有一个可以使用的arrayBuffer
方法继承自它。Blob
在稍微不那么现代的环境中,您可以使用
FileReader
'readAsArrayBuffer
方法。
这是#1的示例:
document.querySelector("input").addEventListener("change", function() {
const [file] = this.files;
if (file) {
console.log("Reading...");
file.arrayBuffer()
.then(data => {
console.log(`Read ${data.byteLength} bytes`);
})
.catch(error => {
console.error(error);
});
}
});
<input type="file">
这不会在读取文件时阻塞主 UI 线程。(只是检查确定。)(也就是说,我尝试使用Response
但它也没有......)
推荐阅读
- c# - Is there a way for a class to access fields in classes that inherit from it using reflection?
- javascript - React - 减少从 Object.map 返回的对象数量
- linux - Verify if IP present in file
- python - AttributeError:“列表”对象没有属性“主机”
- webpack - Is there a way to make multiple production builds with webpack?
- java - Activity null object reference
- django - Adding One-To-One field to the default Django user model
- javascript - 是否可以在 node.js 文件和 html/javascript 文件之间共享变量?
- python - 我很困惑为什么返回函数在我的程序的控制台上打印一个值。它不应该返回一个值吗?
- xcode - 使用 Jenkins 自动构建和部署 React Native 应用程序?