我发现base64编码数据Blob以将其放入JSON字符串的唯一方法是使用 asyncronous readAsDataUrl()函数。
var reader = new window.FileReader();
reader.readAsDataURL(blob);
reader.onloadend = function() {
base64data = reader.result;
console.log(base64data );
}
我的问题是我必须为JSON.stringify(object, replacer)
使用同步替换函数来告诉它如何对Blob进行serieal化。
var replacer = function (key, value) {
if (value instanceof Blob) {
return blobToBase64(value);
}
return value;
}
如何将这两种(异步和同步)方法结合起来?
是否有更好的方法对这些数据进行base64编码同步?
答案 0 :(得分:0)
应该有一个同步 API来读取文件 - FileReaderSync。它的文档说明如下:
8.6读取线程
Web Workers允许使用同步文件或Blob读取API,因为这样的读取 在线程上不会阻塞主线程。本节定义了一个同步API,
可以在工人[Web Workers]中使用 工作人员可以利用异步API(FileReader对象)和同步API (FileReaderSync对象)。
Web Workers的文档可通过上面的引文中的链接获得。尽管我不熟悉Web Workers API,但上面提到的文档提供了格式良好的简单示例,这些示例创建了一个足够直观的API的印象,可以快速开始使用它。
我没有测试这个,但这里是我会重写你的snipet代码:
var jsonfyObjectWhichMightBeABlob = function(obj){
var worker = new Worker('jsonfyBlobSynchroniously.js');
worker.onmessage = function (event) {
return event.data;
//or do something with event.data wich should contain the JSON string
};
worker.postMessage(obj);
};
jsonfyBlobSynchroniously.js
应包含以下内容:
onmessage = function (event) {
var replacer = function(key,value){
if(value instanceof Blob){
var reader = new window.FileReaderSync();
return reader.readAsDataURL(value);
}else{
return value;
}
}
postMessage( JSON.stringify(event.data,replacer) );
};