为什么我的承诺没有得到解决?
Why isn't my promise getting resolved?
我有两个函数——一个下载文件的辅助函数,如下
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 已解决,第一个仍处于挂起状态。
有什么想法吗?
提前致谢
让代码正常工作的一种方法
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 returns 一个承诺,不需要再创建一个
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);
})
多此一举,等于没抓到
我有两个函数——一个下载文件的辅助函数,如下
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 已解决,第一个仍处于挂起状态。
有什么想法吗?
提前致谢
让代码正常工作的一种方法
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 returns 一个承诺,不需要再创建一个
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);
})
多此一举,等于没抓到