xmlhttprequest не работает должным образом в функции - PullRequest
4 голосов
/ 14 марта 2012

Кто-нибудь знает, почему upload.onprogress не работает правильно, если он на отдельной функции?

Код работает правильно (индикатор выполнения медленно перемещается):

        xhr.upload.onprogress = function(e) {
            if (e.lengthComputable) {
                progress.value = (e.loaded / e.total) * 100;
            }
        };  

но если я включу его в работу, он больше не будет работать:

xhr.upload.onprogress = uploadProgress(event);

function uploadProgress(e) {
    if (e.lengthComputable) {
        progress.value = (e.loaded / e.total) * 100;
    }
}   

Во втором коде индикатор выполнения сразу переходит на 100% после завершения загрузки файла, вместо этого переходит на 100% во время загрузки


Итак, я попробовал предоставленное решение, оно действительно работает, если я помещу функцию внутрь. Нет ли способа вывести его за пределы функции?

        function uploadFile(blobFile, fileName) {
            ...
            ...

            // Listen to the upload progress for each upload.
            xhr.upload.onprogress = uploadProgress;

            // Progress Bar Calculation why it has to be in uploadFile function..
            function uploadProgress(e) {
                if (e.lengthComputable) {
                    progress.value = (e.loaded / e.total) * 100;
                }
            }                            

            uploaders.push(xhr);
            xhr.send(fd);
        }  

        //it does not work if I put it outside the function. is there anyway to do this?  
        function uploadProgress(e) {
             if (e.lengthComputable) {
                 progress.value = (e.loaded / e.total) * 100;
             }
        }   

Ответы [ 3 ]

6 голосов
/ 14 марта 2012

С помощью uploadProgress(event); вы вызываете саму функцию и присваиваете возвращаемое значение xhr.upload.onprogress вместо назначения его в качестве функции обратного вызова:

xhr.upload.onprogress = uploadProgress;
1 голос
/ 14 марта 2012

Как насчет определения функции перед присвоением в качестве обратного вызова? У JavasCript иногда возникают проблемы при определении функций позже.

Я имею в виду, вы можете заменить:

// Listen to the upload progress for each upload.
xhr.upload.onprogress = uploadProgress;

// Progress Bar Calculation
function uploadProgress(e) {
    if (e.lengthComputable) {
         progress.value = (e.loaded / e.total) * 100;
    }
}

с

// Progress Bar Calculation
function uploadProgress(e) {
    if (e.lengthComputable) {
         progress.value = (e.loaded / e.total) * 100;
    }
}
// Listen to the upload progress for each upload.
xhr.upload.onprogress = uploadProgress;
1 голос
/ 14 марта 2012

Во втором примере вы должны использовать

xhr.upload.onprogress = uploadProgress;

не

xhr.upload.onprogress = uploadProgress(event);

Вы назначили результат вызова функции, а не ссылку на функцию.

...