У меня есть две функции - вспомогательная функция для загрузки файлов, которая является следующимПочему мое обещание не разрешилось?
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-х файлов, второе обещание разрешено, а первое из них все еще находится в состоянии ожидания.
Любые идеи?
Заранее спасибо
Вы плохо злоупотребляете обещаниями. Вы должны нажать на тот, который был возвращен из 'downloadHelper', прямо в ваш массив, и без необходимости обещать обещания в обещаниях. – meagar
ваш отложенный объект в downloadAll получает перезапись на каждой итерации цикла for. Итак, только последний будет разрешен. –
@JaromandaX Но разве я не создаю новый отложенный объект с 'var deferred = Q.defer()'? – harryjohn