javascript - 使用javascript循环遍历fileList

标签 javascript jquery ajax form-data

我在这里试图完成的是为每个上传的文件创建一个单独的 ajax 请求。我有一个 ajax 调用,它创建一个记录并返回一些 html 和 ajax 调用使用的记录的 tempID,该调用在第一次调用成功时执行。此过程似乎运行正常。出现问题的地方是通过 filesList 的循环。在 ajax 调用之前,循环似乎工作正常,但在 ajax 调用期间,当我期望文件列表递增到数组中的下一个文件时,它再次发送第一个文件。

如果我只选择一个文件,那么一切正常。就好像 ajax 调用没有看到变量"file"在有多个文件时在循环开始时被重置....让我难过...

/* Fire the ajax requests when the input files array changes
--------------------------------------------------------------------------*/
$('#theFile').on('change', function()
{
    var len = this.files.length;

    for(var i = 0; i < len; i++)
    {
        var file = this.files[i];
        // console.log(file.name); This shows the correct file name

        var formData = new FormData();
        formData.append("file_" + i, file);

        $.ajax(
        {
            url: '/controllerName/buildImageLoadingDIVS',
            type: 'POST',
            dataType:'json',
            data: 'fileName=' + file.name,
            success: function(data1)
            {
                $('#theImages').append(data1.content);

                formData.append("tempID", data1.tempID);

                // console.log(file.name); 
                // This shows the first filename in the array as if 
                // variable "file" was never set to new filelist

                $.ajax(
                {
                    url: '/controllerName/the_image_upload',
                    type: 'POST',
                    data: formData,
                    processData: false,
                    contentType: false,
                    success: function(data2)
                    {
                        $('#temp_wrapper_' + data1.tempID).html(data2);
                    }
                });
            }
        });
    }

最佳答案

您面临关闭问题。由于所有成功回调都共享相同的闭包,因此如果在循环结束后执行任何成功回调(在大多数情况下),所有成功回调都共享相同的文件值。解决方案是使用 IIFE 创建闭包。

修改后的代码:

       //dummy file array    
        var fileArray = ['file1', 'file2', 'file3']
        var len = fileArray.length;

        for(var i = 0; i < len; i++)
        {
            var file = fileArray[i];
            console.log(file);

            var formData = new FormData();
            formData.append("file_" + i, file);
            (function(params){
                var file = params.file;
                var formData = params.formData;
                        $.ajax(
            {
                //used this url for testing purpose, replace it with yours
                url: 'http://fiddle.jshell.net',
                type: 'get',
                //change the datatype in your implementation
                dataType:'html',
                data: 'fileName=' + file,
                success: function(data1)
                {
                    //$('#theImages').append(data1.content);

                    formData.append("tempID", data1.tempID);

                    console.log("file name in success " + file); 


                    $.ajax(
                    {
                        url: 'http://fiddle.jshell.net',
                        type: 'get',
                        data: formData,
                        processData: false,
                        contentType: false,
                        success: function(data2)
                        {
                                            console.log("success"); 
                        }
                    });
                },
                error : function(){
                    console.log("error");
                }
            });
            })({
                'formData' : formData,
                'file' : file
            });
        }

你可以找到 fiddle here

关于javascript - 使用javascript循环遍历fileList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23726711/

相关文章:

jquery - Ajax .load() 后加载的内容会丢失字符集(UTF-8),但仅限于 FireFox 和 IE。 Chrome 和 Opera 运行良好

JQuery Animate Jumpy 仅在 Safari 中

javascript - 是否可以将脚本动态加载到引用局部变量的 div 中?

javascript - jQuery .live() 和 .each() 与 AJAX 轮询

ajax - React - ajax post 请求后更新状态的方法

java - 无法从 START_ARRAY token 中反序列化 CUSTOM_CLASS 实例

javascript - 如何向一个元素添加一个类并从所有兄弟元素中删除一个类

javascript - 404 和 500 上的 JQuery Mobile “Error Loading Page”

javascript - highcharts 组织结构图在加载模块时抛出错误

javascript - GraphQL + Apollo 错误 : Uncaught (in promise)