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個文件中的第二個promise被解析,第一個仍處於掛起狀態。
任何想法?
在此先感謝
你嚴重濫用承諾。您應該將'downloadHelper'返回的那個直接推入您的數組中,而不是不必要地承諾承諾中的承諾。 – meagar
下載中的延遲對象在for循環的每次迭代中,都會被覆蓋。所以,只有最後一個將得到解決 –
@JaromandaX但是我不是創建一個新的延遲對象'var deferred = Q.defer()'? – harryjohn