【发布时间】:2014-06-09 17:13:23
【问题描述】:
我有一个 URL 数组,我使用 for 循环调用 http.get 请求。由于这是一个异步进程,我想在所有请求都返回后调用 done。
这是我目前的尝试:
grunt.registerTask('verify', function() {
var done = this.async();
var promises = [];
var urlPrefix = 'http://example.com/';
for(var i = 0; i < deployableFiles.length; i++) {
(function(i) {
var deferred = Q.defer();
promises.push(deferred);
var file = deployableFiles[i];
var path = file.filetype + '/' + getVersionedFileName(file.basename, file.filetype);
http.get(urlPrefix + path, function(res) {
deferred.resolve();
if(res.statusCode === 200) {
grunt.log.oklns(path + ' was found on production server.');
} else {
grunt.log.error('Error! ' + path + ' was not found on production server!');
}
}).on('error', function(e) {
grunt.log.error("Got error: " + e.message);
done();
});
})(i);
}
Q.all(promises)
.done(function() {
// Everything executed correctly
return done();
}, function(reason) {
// There was an error somewhere
return done(false);
});
});
我确定只是我没有正确理解节点的整个异步性质,但有什么对其他人来说显而易见的事情吗?
我搜索了有关在 Q 库中使用 http 的信息,看来可能需要使用 Q.nfcall 才能使其工作。我只是无法理解为什么我必须这样做。 (我并不反对实际这样做,我比其他任何事情都更好奇)
谢谢!
【问题讨论】:
-
您能否更明确地说明您面临的问题?你期望它做什么,它实际上在做什么?
标签: javascript node.js promise q