Ho intenzione di caricare un array di file usando jQuery.Come utilizzare quando inviare il file in modo sequenziale in una funzione che è anche una promessa differita?
Questa intenzione è racchiusa in una funzione denominata uploadFilesUsingAjax()
;
var uploadFilesPromise = uploadFilesUsingAjax();
$.when(uploadFilesPromise).done(function (uploadFilesAjaxResult) {
// redirect to success page...
Ho bisogno di aspettare che tutti i file vengano caricati correttamente prima di fare qualcos'altro.
All'interno uploadFilesUsingAjax()
,
ho scritto il mio codice in questo modo
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!')});
Purtroppo, non ero in grado di caricare un sacco di file prima mi sono reindirizzato alla pagina di successo.
Ho provato varie soluzioni StackOverflow su come eseguire questa operazione. Finora niente funziona. Si prega di avvisare.
Alcuni codici sono stati troncati per risparmiare spazio.
Ho un piccolo problema con il '.map' perché l'URL può essere diversa a seconda di ciò che voglio usare l'uploadFilesUsingAjax(). Come posso superare questa situazione? –
Si sta mappando un array di _stuff_ in una matrice di attività di richiesta. Hai accesso all'oggetto file - puoi '.map' a un URL diverso basato su una proprietà dell'oggetto' file' passato alla funzione you' .map' con. –
Mi dispiace per il commento precedente. So come risolvere il problema. Ho invece scritto funzioni alias. Ho provato ad aggiungere una parentesi in più che mancava nella risposta. BUt non poteva perché StackOverflow richiede di aggiungere almeno 6 caratteri. Mancano 'd.reject (new Error (" Chiamato uploadFiles senza file da caricare "));' Dovrebbe essere una doppia parentesi alla fine. –