2013-09-22 35 views
9

mam array (fe jest kolejka plików):

[{deferred: fileDef, data: file}, {...}, ...] 

Każdy fileDef i plik wyślij przesłać funkcję, która powrotu fileDef.promise i nazywają fileDef.resolve lub fileDef.reject po przesłaniu.

Chcę przesłać pliki w kolejności: następny plik po wczytaniu poprzedniego pliku.

Teraz używam

var queue = []; 
var uploading = false; 

//file input callback call each time the user selects files 
function addAndUpload (file) { 

    queue.push({deferred: $q.defer(), data: file}); 

    if (!uploading) recurceQueue(); 

    function recurceQueue() { 
    if (queue.length) { 
     uploading = true; 
     var fileObj = queue.shift(); 
     upload(fileObj.deferred, fileObj.data); 

     fileObj.deferred.promise.finally(function() { 
     uploading = false; 
     recurceQueue(); 
     }) 
    } 
    } 
} 

Ale wydaje się zły. Jak pisać lepiej?

+0

dlaczego dont u obietnicę łańcucha zamiast ?? –

+0

Ponieważ nie oczekuję teraz kolejki o rozmiarze – tamtakoe

+0

Co się stanie, jeśli przesyłanie się nie powiedzie? Czy to nie ma znaczenia? – Bergi

Odpowiedz

9

Nie używaj kolejki i tej flagi boolowskiej, wystarczy mieć jedną zmienną przechowującą obietnicę reprezentującą wszystkie przesłane. Ponadto, twoja funkcja upload nie powinna wymagać odroczonego obiektu do rozstrzygnięcia jako argumentu, ale po prostu nowa obietnica.

Następnie addAnUpload staje się tak proste, jak

var allUploads = $q.when(); // init with resolved promise 

function AddAnUpload(file) { 
    allUploads = allUploads.then(function() { 
     return upload(file); 
    }); 
} 

Z zamknięcia, nie trzeba, że ​​queue przechowywać przesłane oczekujących więcej. Jeśli chcesz allUploads wypełniać zawsze, nawet jeśli jeden upload nie trzeba zwracać zawsze spełniające obietnicy z then -callback:

 return upload(file).then(null, function(err) { 
      console.log(err, "does not matter"); 
     }); // fulfills with undefined in error case 
+0

Zobacz przykład: https://github.com/tamtakoe/oi.file/blob/master/oi.file .js # L251 Nie mogę użyć obietnicy w kolejce, ponieważ potrzebuję odrzucenia i rozwiązania w funkcjach transportowych – tamtakoe

+0

@tamtakoe: Nie widzę z tym problemu? – Bergi

+0

bez problemu. Wydaje mi się, że mój kod jest nieprodukcyjny, ponieważ korzystam z tablicy defferedów, a nie z szeregu obietnic. – tamtakoe