我需要一些帮助,从下面的函数返回“bytes”变量,以用作另一个函数的输入。
function openfile() {
var input = document.getElementById("files").files;
var fileData = new Blob([input[0]]);
var reader = new FileReader();
reader.readAsArrayBuffer(fileData);
reader.onload = function(){
var arrayBuffer = reader.result
var bytes = new Uint8Array(arrayBuffer);
console.log(bytes);
}
我想返回上面的函数,并在另一个函数中使用字节数组作为输入参数。
答案 0 :(得分:8)
您可以使用promises等待文件阅读器完成加载文件。
Promise 对象用于延迟和异步计算。承诺代表了一项尚未完成但仍将在未来完成的行动。
Here您可以找到有关承诺的更多信息。
以下是一个关于如何将承诺整合到您的情况中的示例。
<%= "#{p.nom} " %>
&#13;
(function (document) {
var input = document.getElementById("files"),
output = document.getElementById('output'),
fileData; // We need fileData to be visible to getBuffer.
// Eventhandler for file input.
function openfile(evt) {
var files = input.files;
// Pass the file to the blob, not the input[0].
fileData = new Blob([files[0]]);
// Pass getBuffer to promise.
var promise = new Promise(getBuffer);
// Wait for promise to be resolved, or log error.
promise.then(function(data) {
// Here you can pass the bytes to another function.
output.innerHTML = data.toString();
console.log(data);
}).catch(function(err) {
console.log('Error: ',err);
});
}
/*
Create a function which will be passed to the promise
and resolve it when FileReader has finished loading the file.
*/
function getBuffer(resolve) {
var reader = new FileReader();
reader.readAsArrayBuffer(fileData);
reader.onload = function() {
var arrayBuffer = reader.result
var bytes = new Uint8Array(arrayBuffer);
resolve(bytes);
}
}
// Eventlistener for file input.
input.addEventListener('change', openfile, false);
}(document));
&#13;
答案 1 :(得分:2)
如果您通过事件的onload
功能,则可以使其正常工作。
reader.onload = function(e){
var arrayBuffer = e.target.result;
var bytes = new Uint8Array(arrayBuffer);
console.log(bytes);
}
这会将其从reader.result
更正为e.target.result;
。
此外,使用fileData
时遇到问题,Blob[files[0]]
设置为reader.readAsArrayBuffer
并将其发送到fileData
。移除reader.readAsArrayBuffer(input[0]);
,然后使用{{1}}进行调用。