为什么我的承诺得不到解决?

时间:2016-03-03 14:35:01

标签: javascript promise q

我有两个函数 - 用于下载文件的辅助函数,如下所示

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);
}

完成永远不会被召唤!

出于调试目的,我添加了一个将在10秒后调用的setTimeout,我看到的是2个文件,第二个promise已经解决,第一个仍然处于暂挂状态。

有什么想法吗?

提前致谢

1 个答案:

答案 0 :(得分: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返回了一个promise,因此无需创建另一个

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);
})

这是多余的,它与没有捕获的

相同