Q.nvovo不能处理响应

我制作下载YouTubevideo的function并上传到s3。 但是我正面临着一个问题。如果我使用Q.all上传video到s3,它工作正常,但如果我在Q.all的地方使用Q.ninvoke,它总是无法处理成功的响应,并给错误object has no method apply

 function checkYoutubeRecord(youtubeRecords){ var totalCount = youtubeRecords.length; var count = 0; (function downloadLoop(record){ if(record.Size > 0){ if(count === totalCount-1){ console.log('\n\n\ncomplete downloading\n\n\n'); }else{ count = count + 1; downloadLoop(youtubeRecords[count]); } }else{ /*If the size of the record is zero then if don't need to check if it exist in the log or not as we have to upload it because of zero size*/ downloadYoutubeVideo(record,function(done){ if(done){ var removeMp2 = record.Key.split('.'); var removePath = removeMp2[0].split('/'); **// If use Q.ninvoke throw error Object has no method apply** Q.all([ uploadS3.uploadToS3( __dirname + '/tmp/' + removePath[1] + ".mp4",'/videoTestmp4')]) .spread(function(uploads){ console.log('\n\n\n********************************************'); console.log('uploaded successfully==========>>>>>>',record); console.log('********************************************\n\n\n'); fs.unlink( __dirname + '/tmp/' + removePath[1] + ".mp4", function(err) { if( err ){ console.log(err); console.log('error in unlinking of'+ removePath[1] + '.mp4 file'); }else{ console.log('successfully removed from tmp folder'+ removePath[1] + '.mp4 file'); } }); loggerSuccess.info(youtubeRecords[count]); if(count === totalCount-1){ console.log('\n\n\ncomplete downloading\n\n\n'); }else{ count = count + 1; downloadLoop(youtubeRecords[count]); } }) .fail(function(err){ console.log('\n\n\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'); console.error('fail in uploading the ogv and mp3',record); console.log('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n\n\n'); if(failureCount <= 3){ failureCount = failureCount + 1; downloadLoop(youtubeRecords[count]); }else{ failureCount = 0; loggerfailure.info(youtubeRecords[count]); count = count + 1; downloadLoop(youtubeRecords[count]); } }) }else{ console.log('\n\n\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'); console.error('fail in uploading the ogv and mp3',record); console.log('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n\n\n'); if(failureCount <= 3){ failureCount = failureCount + 1; downloadLoop(youtubeRecords[count]); }else{ failureCount = 0; loggerfailure.info(youtubeRecords[count]); count = count + 1; downloadLoop(youtubeRecords[count]); } } }); } })(youtubeRecords[0]); } 

将video上传到s3的模块

 var path = require('path') ; var AWS = require('aws-sdk') ; var fs = require('fs') ; var Q = require('q'); module.exports = { uploadToS3: function(file, s3folder){ var deferred = Q.defer(); AWS.config.update({ accessKeyId: "********************", secretAccessKey: "*******************" }); var filename = path.basename( file ) ; var key = s3folder + "/" + filename ; var s3 = new AWS.S3(); s3.listObjects({ Bucket: '****************', MaxKeys: 10, Prefix: key }, function(err, data) { console.log('\n\n\n********************************************'); console.log('source =====>>>>',file); console.log('S3 destination ',key); console.log('********************************************\n\n\n'); fs.readFile(file, function(err, data) { s3.putObject({ Bucket: '****************', Key: key, Body: data, ACL: 'public-read' }, function(err, response) { if(err){ console.log('\n\n\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'); console.log('errror =>>>>',err); console.log('file fail to upload ',file); console.log('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n\n\n'); deferred.reject(err); } console.log('\n\n\n********************************************'); console.log('response =>>>>',response); console.log('s3 destination ',key); console.log('successfully uploaded to s3'); console.log('********************************************\n\n\n'); deferred.resolve('uploaded'); }); }); }); return deferred.promise; } };