Since previewfile() relies on asynchronous activity, it itself is asynchronous. Thus, he cannot reliably return a value, but he can return a promise.
As others have pointed out, previewfile() can be written to accept a callback, avoiding the need for a promise. However, if you want to receive a promise, here is one (of course, not the only one).
function previewfile(file, tests, acceptedTypes, holder) { if(tests.filereader === true && acceptedTypes[file.type] === true) { var reader = new FileReader(), image; var promise_a = $.Deferred(function(dfrd) { reader.onload = function(event) { image.attr('src', event.target.result).appendTo(holder); dfrd.resolve(); }; reader.onerror = function() { dfrd.reject('fileReader error'); }; }).promise(); var promise_b = $.Deferred(function(dfrd) { image = $("<img/>").on('load', function() { var widthOfImage = image.width; var heightOfImage = image.height; if (checkImageDimensions(widthOfImage, heightOfImage)) { dfrd.resolve(); } else {
readfiles() can now be written as follows:
function readfiles(files, tests, acceptedTypes, holder, progress) { return previewfile(files[0], tests, acceptedTypes, holder).then(function() {
The advantage of a promise-based solution is perhaps not so much in successful management as in managing errors. Notice how one handler reports several different types of errors.
source share