Zamierzam załadować tablicę plików za pomocą jQuery.Jak używać, kiedy należy przesłać dalej plik w funkcji, która jest również odroczoną obietnicą?
Ten zamiar jest zawijany w funkcję o nazwie uploadFilesUsingAjax()
;
var uploadFilesPromise = uploadFilesUsingAjax();
$.when(uploadFilesPromise).done(function (uploadFilesAjaxResult) {
// redirect to success page...
Muszę poczekać, aż wszystkie pliki zostaną pomyślnie przesłane, zanim zrobię coś innego.
Wewnątrz uploadFilesUsingAjax()
,
pisałem mój kod ten sposób
function uploadFilesUsingAjax() {
var files = pages; // pages is a global variable which is an array of files
var url = "https://stackoverflow.com/users/" + currentUser.id + "/files.json";
var type = "POST";
console.info('files length:' + files.length);
if (files.length > 0) {
var promises=[];
for (var i = 0; i < files.length; i++) {
var data = new FormData();
var postData = {};
var file = files.getByIndex(i);
var key = i + 1;
if (typeof (file.id) !== "undefined" && file.id > 0) {
data.append(key, JSON.stringify(file));
} else {
data.append(key, file);
}
var request = $.ajax({
//this is the php file that processes the data
url: url,
//POST method is used
type: type,
//pass the data
data: data,
//Do not cache the page
cache: false,
xhr: function() {
// custom xhr
myXhr = $.ajaxSettings.xhr();
if(myXhr.upload) { // check if upload property exists
myXhr.upload.addEventListener('progress',updatePagesProgress, false); // for handling the progress of the upload
}
return myXhr;
},
// DO NOT set the contentType and processData
// see http://stackoverflow.com/a/5976031/80353
contentType: false,
processData: false,
//success
success: function (json) {
// json is already an object thanks to cakephp code to serialize
//if POST is a success expect no errors
if (json.error == null && json.result != null) {
currentUser = json.result.User;
// error
} else {
alert(json.error);
}
}
});
promises.push(request);
}
var promise = promises[0];
for (var i = 1; i < promises.length; i++) {
promise = promise.then(promises[i]);
}
return promise.done(function() { console.log('all!')});
Niestety, nie udało się załadować wiele plików przed mam przekierowany do strony sukces.
Próbowałem różnych rozwiązań StackOverflow, jak to zrobić. Do tej pory nic nie działa. Proszę doradź.
Niektóre kody zostały obcięte, aby zaoszczędzić miejsce.
Mam mały problem przy użyciu '.map' ponieważ URL może być różny w zależności od tego, co chcę użyć uploadFilesUsingAjax(). Jak mogę przezwyciężyć tę sytuację? –
Odwzorowujesz tablicę _stuff_ na tablicę zadań żądań. Masz dostęp do obiektu pliku - możesz '.map' na inny adres URL na podstawie właściwości obiektu' file' przekazanego do funkcji którą '.map' z. –
Przepraszamy za wcześniejszy komentarz. Wiem, jak obejść ten problem. Zamiast tego napisałem funkcje aliasów. Próbowałem dodać dodatkowy nawias, którego brakowało w twojej odpowiedzi. BUt nie mógł, ponieważ StackOverflow wymaga dodania co najmniej 6 znaków. Brakuje ci w 'd.reject (nowy błąd (" Called uploadFiles bez plików do przesłania "));' Powinien być podwójny nawias na końcu. –