2016-03-03 89 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個文件中的第二個promise被解析,第一個仍處於掛起狀態。

任何想法?

在此先感謝

+1

你嚴重濫用承諾。您應該將'downloadHelper'返回的那個直接推入您的數組中,而不是不必要地承諾承諾中的承諾。 – meagar

+1

下載中的延遲對象在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); 
    })); 
} 

你會看到我刪除了

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

這是多餘的,這是一樣的沒有捕獲