javascript - Angular 2 : Asynchronous upload array of files

标签 javascript angular filereader

我正在尝试使用 FileReader 上传一组文件,这些文件经过 base64 编码并存储在一个数组中以供进一步处理。我正在努力理解我需要创建的模式以确保所有文件都已上传,因为我必须等待 onload 事件处理程序触发。例如;

如果我将一组文件传递给以下函数,它将在文件实际上传之前解决 promise 。

localUploads( event ) : any {

    var response = [];

    return new Promise( function(resolve, reject) {

        //Retrieve all the files from the FileList object
        var files = event.target.files;
        var response = [];

        if (files) {

            for (var i=0, f; f=files[i]; i++) {

                var r = new FileReader();

                r.onload = (function(f) {

                    return function(e) {

                        let contents = e.target['result'];

                        let file = {
                            name: f.name,
                            asset: contents,
                            private: false
                        };

                        console.log('we are pushing into the array');
                        response.push( file );
                    };

                })(f);


            }   
            resolve( response );
        }

        r.readAsText(f);
    });
}

任何人都可以请教新手吗?

非常感谢。

最佳答案

一切都是为了在正确的时间兑现 promise 。目前您在循环完成时解决它,但这并不意味着所有项目都已处理。我没有使用过 FileReader,但你应该可以这样做:

localUploads( event ) : any {

    var response = [];

    return new Promise(function(resolve, reject) {

        //Retrieve all the files from the FileList object
        var files = event.target.files;
        var response = [];

        if (files) {

            for (var i=0, f; f=files[i]; i++) {

                var r = new FileReader();
                r.onload = function(e) { // Possible clean-up?
                    let contents = e.target['result'];

                    let file = {
                        name: f.name,
                        asset: contents,
                        private: false
                    };

                    console.log('we are pushing into the array');
                    response.push( file );
                    if(response.length == files.length)
                    {
                        // Everything is done. Resolve the promise.
                        resolve( response );
                    }
                };
                // Moved here to be able to access r and f variables
                r.readAsText(f);
            }   
        }
    });
}

或者使用 $q 的旧方法。

    var response = [];
    var dfd = $q.defer();

    //Retrieve all the files from the FileList object
    var files = event.target.files;
    var response = [];

    if (files) {
        for (var i=0, f; f=files[i]; i++) {
            var r = new FileReader();
            r.onload = function(e) { // Possible clean-up?
                let contents = e.target['result'];

                let file = {
                    name: f.name,
                    asset: contents,
                    private: false
                };

                console.log('we are pushing into the array');
                response.push( file );
                if(response.length == files.length)
                {
                    // Everything is done. Resolve the promise.
                    dfd.resolve(response);
                }
            };
            // Moved here to be able to access r and f variables
            r.readAsText(f);
        }   
    }
    else {
        // Possible resolve promise here to?
    }
    return dfd.promise;

请注意,您可能还想处理可能出现的错误。如果其中一个文件没有成功完成, promise 将永远不会得到解决。

您可能需要解决 onloadend 中的 promise 而不是 onload。我真的无法从 docs 中找出答案.

var r = new FileReader();
r.onload = function(e) {
    if(response.length == files.length)
    {
        // Everything is done. Resolve the promise.
        dfd.resolve(response);
    }
}

关于javascript - Angular 2 : Asynchronous upload array of files,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39955367/

相关文章:

Javascript时钟,改变时间

javascript - 通过 id 数组获取数据

c# - 将固定长度文件中的数据读入类对象

C# File.ReadAllText 返回 "NotSupportedException"

javascript - 使用 HTML5 文件 API 读取存储在某些 URL 上的文件

javascript - 通过变量访问嵌套对象键

javascript - 未捕获的语法错误 : Invalid or unexpected token load-scripts. php:343 - WordPress 小部件

twitter-bootstrap - CSS或Angular2中点击事件的SlideOut控件

javascript - 按日期分组的问题

angular - 如何在 Dart Angular 中编写双向绑定(bind)