2016-03-29 17 views
0

Bir Q.allSettled bittikten sonra bir söz ertelenmeye çalışıyorum. Ancak, allSettled'un .then hiçbir zaman yürütülmez ve söz dizimi sonuçları hiçbir zaman iade edilmez. Hiçbir istisna atılmadı .then bloğuna asla girmem. Aşağıdaki koddan da görebileceğiniz gibi, bazı dosya yükleme öğeleri üzerinde yinelenen ve daha sonra dosya yüklemelerini yürüten ve bu geri dönüşlere dayanarak bazı tasarruflar yapan bir .then bloğunun içindeyim.Q.allSettled sözlü iadesi sonuçları döndürmüyor

var deferred = Q.defer(); 

datacontext.getFileNameGuid(fileNamesNeeded).then(function (data) {     
    _.each($fileUploads, function(item){ 
     if (item.files.length > 0) { 
      var promise = uploadFile(item, data[remainingFilesToUpload]) 
       .then(function() { 
        return datacontext.saveItem(atom) 
         .then(function (data) { 
          return getItemSuccess(data, false); 
         }).done(); 
       }).catch(function (data) { 
        logger.logError("An error occurred while updating your item. Please try again.", data, 'Error', true);         
       }).done(); 

      fileUploadPromises.push(promise); 

      return promise; 
     } 
    }); 

    // Either execute promises or bail 
    if (fileUploadPromises.length > 0) { 
     // Handle blockUI and spinner in last then. 
     Q.allSettled(fileUploadPromises).then(function() { 
      deferred.resolve('Images have been saved and scheduled for thumbnail generation.'); 
     }); 
    } else { 
     // Other logic here 
    } 
}); 

return deferred.promise; 
+0

Her şeyden önce, [ertelenmiş antipattern] 'den (http://stackoverflow.com/q/23803743/1048572) kaçının! – Bergi

+0

Hangi “o” geri aramalardan hangisi daha önce hiç katılmıyorsunuz? – Bergi

+0

Bu .done() 'ın hiçbirine neden yok Q.allSettled'den sonra" o "i çalıştırmam gerekiyor ... – Bergi

cevap

0

@Bergi tavsiye aldıktan sonra ben deferred antipattern kullanıyordum kod bir demet refactored. Sözümü geri vermek ve Q.allSettled'i Q.all'a çevirmek için kodumu Q.fcall bloğumda tamamladım. Aşağıda çalışma kodumun son durumu var.

NOT: Durandal'ın özel işlevlerine ve atladığım diğer işlevlere işlev çağrıları vardır.

return Q.fcall(function() { 
    try { 

     var fileUploadPromises = []; 
     var $fileUploads = $(fileUploadClass); 
     var fileNamesNeeded = 0; 

     $fileUploads.each(function (index, item) { 
      if (item.files.length > 0) 
       fileNamesNeeded++; 
     }); 

     return datacontext.getFileNameGuid(fileNamesNeeded).then(function (data) { 
      _.each($fileUploads, function (item) { 
       if (item.files.length > 0) { 
        // Init upload file promise         
        var promise = uploadFile(item, data[remainingFilesToUpload]) 
         .then(function() { 
          return datacontext.saveItem(atom) 
           .then(function (data) { 
            return getItemSuccess(data, false); 
           }); 
         }).catch(function (data) {           
          logger.logError('An error occurred while updating your Item. Please try again.', data, 'Error', true); 
          app.trigger(config.publishedMessageNames.AtomFileUploaded, ""); 
         }); 

        fileUploadPromises.push(promise); 

        remainingFilesToUpload++; 
       } 
      }); 

      // Either execute promises or bail 
      if (fileUploadPromises.length > 0) {        
       return Q.all(fileUploadPromises) 
       .then(function (results) {         
        return datacontext.scheduleBatchTask(filesToUpload(), item.DocumentId()).then(function() { 
         app.trigger(config.publishedMessageNames.FileUploaded, data); 
        }); 
       }).done(); 
      } else { 
       app.trigger(config.publishedMessageNames.FileUploaded, ""); 
      } 
     });     
    } catch (e) { 
     return new Error(e); 
    } 
});