Use promises for file loading.

This commit is contained in:
kovacsv 2021-07-28 08:51:32 +02:00
parent 9901ba1f4c
commit 2757d9ecb5
3 changed files with 60 additions and 93 deletions

View File

@ -95,6 +95,10 @@
style="width: 360px; height: 240px;"
model="../../test/testfiles/obj/hundred_cubes.obj,../../test/testfiles/obj/hundred_cubes.mtl">
</div>
<div class="online_3d_viewer"
style="width: 360px; height: 240px;"
model="../../test/testfiles/obj/hundred_cubes.obj,../../test/testfiles/obj/not_exising.mtl,../../test/testfiles/obj/hundred_cubes.mtl">
</div>
<div class="online_3d_viewer"
style="width: 360px; height: 240px;"
model="../../test/testfiles/3ds/cube_four_instances.3ds,../../test/testfiles/3ds/texture.png"

View File

@ -142,22 +142,21 @@ OV.FileList = class
return;
}
let format = this.GetFileFormat (file);
let callbacks = {
success : (content) => {
file.SetContent (format, content);
},
error : () => {
},
complete : () => {
complete ();
}
};
let loaderPromise = null;
if (file.source === OV.FileSource.Url) {
OV.RequestUrl (file.fileUrl, format, callbacks);
loaderPromise = OV.RequestUrl (file.fileUrl, format);
} else if (file.source === OV.FileSource.File) {
OV.ReadFile (file.fileObject, format, callbacks);
loaderPromise = OV.ReadFile (file.fileObject, format);
} else {
complete ();
return;
}
loaderPromise.then ((content) => {
file.SetContent (format, content);
}).catch (() => {
}).finally (() => {
complete ();
});
}
GetFileFormat (file)

View File

@ -37,94 +37,58 @@ OV.GetFileExtension = function (filePath)
return fileName.substr (firstPoint + 1);
};
OV.RequestUrl = function (url, format, callbacks)
OV.RequestUrl = function (url, format)
{
function OnSuccess (result)
{
if (callbacks.success) {
callbacks.success (result);
}
if (callbacks.complete) {
callbacks.complete ();
}
}
function OnError ()
{
if (callbacks.error) {
callbacks.error ();
}
if (callbacks.complete) {
callbacks.complete ();
}
}
let request = new XMLHttpRequest ();
request.open ('GET', url, true);
if (format === OV.FileFormat.Text) {
request.responseType = 'text';
} else if (format === OV.FileFormat.Binary) {
request.responseType = 'arraybuffer';
} else {
OnError ();
return;
}
request.onload = function () {
if (request.status === 200) {
let response = request.response;
OnSuccess (response);
return new Promise ((resolve, reject) => {
let request = new XMLHttpRequest ();
request.open ('GET', url, true);
if (format === OV.FileFormat.Text) {
request.responseType = 'text';
} else if (format === OV.FileFormat.Binary) {
request.responseType = 'arraybuffer';
} else {
OnError ();
reject ();
return;
}
};
request.onerror = function () {
OnError ();
};
request.send (null);
request.onload = function () {
if (request.status === 200) {
resolve (request.response);
} else {
reject ();
}
};
request.onerror = function () {
reject ();
};
request.send (null);
});
};
OV.ReadFile = function (file, format, callbacks)
OV.ReadFile = function (file, format)
{
function OnSuccess (result)
{
if (callbacks.success) {
callbacks.success (result);
}
if (callbacks.complete) {
callbacks.complete ();
}
}
return new Promise ((resolve, reject) => {
let reader = new FileReader ();
function OnError ()
{
if (callbacks.error) {
callbacks.error ();
}
if (callbacks.complete) {
callbacks.complete ();
}
}
reader.onloadend = function (event) {
if (event.target.readyState === FileReader.DONE) {
resolve (event.target.result);
}
};
reader.onerror = function () {
reject ();
};
let reader = new FileReader ();
reader.onloadend = function (event) {
if (event.target.readyState === FileReader.DONE) {
OnSuccess (event.target.result);
if (format === OV.FileFormat.Text) {
reader.readAsText (file);
} else if (format === OV.FileFormat.Binary) {
reader.readAsArrayBuffer (file);
} else {
reject ();
}
};
reader.onerror = function () {
OnError ();
};
if (format === OV.FileFormat.Text) {
reader.readAsText (file);
} else if (format === OV.FileFormat.Binary) {
reader.readAsArrayBuffer (file);
} else {
OnError ();
}
});
};