2016-03-03 2 views
0

У меня есть две функции - вспомогательная функция для загрузки файлов, которая является следующимПочему мое обещание не разрешилось?

var downloadHelper = function(url, saveDir) { 
    var deferred = Q.defer(); 

    setTimeout(function() { 
     deferred.resolve("success");  
    }, 2000); 


    return deferred.promise; 
} 

Теперь у меня есть список файлов, которые будут загружены параллельно. У меня есть логика для этой функции следующим образом:

var downloadAll = function() { 
    var fileDownloadList = [] 
    for(var key in config.files) { 

     var deferred = Q.defer(); 
     var saveLocation = __base + config.localDir 
     downloadHelper(
      config.files[key], 
      saveLocation 
     ).then(function() { 
      deferred.resolve("downloaded: " + fileUrl); 
     }).catch(function(err) { 
      deferred.reject(err); 
     }); 

     fileDownloadList.push(deferred.promise); 
    } 

    Q.all(fileDownloadList).done(function() { 
     console.log("All downloaded"); 
    },function(err) { 
     console.log(err); 
    }); 

    setTimeout(function() { 
     console.log(fileDownloadList); 
    }, 10000); 
} 

Проделанная никогда не называется!

В целях отладки я добавил setTimeout, который будет вызываться через 10 секунд, и то, что я вижу, состоит из 2-х файлов, второе обещание разрешено, а первое из них все еще находится в состоянии ожидания.

Любые идеи?

Заранее спасибо

+1

Вы плохо злоупотребляете обещаниями. Вы должны нажать на тот, который был возвращен из 'downloadHelper', прямо в ваш массив, и без необходимости обещать обещания в обещаниях. – meagar

+1

ваш отложенный объект в downloadAll получает перезапись на каждой итерации цикла for. Итак, только последний будет разрешен. –

+0

@JaromandaX Но разве я не создаю новый отложенный объект с 'var deferred = Q.defer()'? – harryjohn

ответ

0

Один из способов сделать код работы

for(var key in config.files) { 
    (function() { 
     var deferred = Q.defer(); 
     var saveLocation = __base + config.localDir 
     downloadHelper(
      config.files[key], 
      saveLocation 
     ).then(function() { 
      deferred.resolve("downloaded: " + fileUrl); 
     }).catch(function(err) { 
      deferred.reject(err); 
     }); 
     fileDownloadList.push(deferred.promise); 
    }()); 
} 

Но поскольку DownloadHelper возвращает обещание, нет необходимости создавать еще один один

for (var key in config.files) { 
    var saveLocation = __base + config.localDir 
    fileDownloadList.push(downloadHelper(
     config.files[key], 
     saveLocation 
    ).then(function() { 
     return("downloaded: " + fileUrl); 
    })); 
} 

Глядишь I удалено

.catch(function(err) { 
    deferred.reject(err); 
}) 

Это избыточно, это то же самое, что и отсутствие уловов

 Смежные вопросы

  • Нет связанных вопросов^_^