修改s3.putObject函数内的变量

时间:2018-03-23 09:25:25

标签: javascript node.js

我写了以下代码将文件上传到亚马逊s3。

 var upload = async function() {

  var uploadURLs = []
  for (var i = 0; i < files.length; i++) {
    fs.readFile(filePath, (error, content) => {
      s3.putObject({
      Bucket: bucketName,
      Key: key,
      Body: content
    }, function(err, data){
  .....
  if (uploadCount == files.length - 1) {
  uploadURLs = allUrls;
  }
 }
}
return uploadURLs
}

代码工作正常,但返回的数组uploadURLs为空,allUrls不是。您对如何解决问题有所了解吗?我想提到这个post我认为没有任何理由说这不起作用。

1 个答案:

答案 0 :(得分:1)

您正在返回一个尚未设置的变量(在您的情况下为uploadURLs),因为您在asyc回调函数中设置它。为了使其正常工作,您应该在返回操作之前等待操作完成。以下声明:

var upload = async function() {

根本没有帮助。你应该做点什么:

var upload = function() {
  return new Promise((success, fail) => {
    var uploadURLs = []
    for (var i = 0; i < files.length; i++) {
      fs.readFile(filePath, (error, content) => {
        if (error) {
          return fail(error);
        }
        s3.putObject({
          Bucket: bucketName,
          Key: key,
          Body: content
       }, function(err, data) {
         if (err) {
           return fail(err);
         }
         .....
         if (uploadCount == files.length - 1) {
           uploadURLs = allUrls;
           return success(uploadURLs);
         }
       }
     }
  });
}

实际上在这种情况下,uploadURL可能完全没必要。另一件事是,只有在计划等待异步函数时才应使用异步。否则它就是浪费。