【问题标题】:Meteor synchronous call to functionMeteor 同步调用函数
【发布时间】:2016-03-09 02:21:40
【问题描述】:

美好的一天。 一直在想办法解决这个问题。

简而言之,我有一个表单,其中包含多个文本输入以及一个输入文件元素,用于将所述文件上传到 AWS S3(通过 lepozepo:s3 ver5.1.4 包)。这个包的好处是它不需要服务器,因此可以检查资源。

这个 S3 包将文件上传到我配置的存储桶并返回 URL 以访问其他几个数据点中的图像。

那么,回到表格。我需要将返回的 AWS URL 与其他表单数据一起放入数据库。但是,由于 S3 调用是异步的,因此 S3 调用比应用程序等待的时间要长,因此我发给 Meteor.call() 的帖子中的字段未定义只是因为它没有等待足够长的时间来获取 AWS URL。

我可以通过将 Meteor.call() 直接放入 S3 调用的回调中来解决这个问题。但是,我希望避免这种情况,因为我更希望 S3 上传是它自己的模块或辅助函数,甚至是任何辅助函数之外的函数,因为它可以在应用程序的其他区域重复使用以进行文件上传。

伪代码:

Template.contacts.events({
  'submit #updateContact': function(e,template){
     s3.upload({file:inputFile, path:client},function(error,result){
       if(error){
         // throw error
       }else{
         var uploadInfo = result;
       }
     });
     formInfo = {name:$('[name=name]').val(),file:uploadInfo}; // <= file is undefined because S3 hasn't finished yet
     Meteor.call('serverMethod',formInfo, function(e,r){
         if(e){
           // throw error message
         }else{
           // show success message
         }
     });
});

我可以将 formInfoMeteor.call() 放在 s3 回调中,但这会导致更复杂的代码和更少的代码重用,而 IMO 这是代码重用的理想场所。

我尝试将 s3 包装在它自己的函数中,无论是否有回调。我试过使用reactiveVars。我认为再次使用 s3 文件信息更新 db 会使 s3 抽象更加复杂,因为它需要知道 _id 等...

有什么想法吗? 谢谢。

【问题讨论】:

    标签: javascript meteor amazon-s3


    【解决方案1】:

    如果您使用的是 javascript,最好使用回调! 使用这种你不喜欢,或者认为是模块化或可重用的回调是什么?

    如下所示,uploader 函数只对 s3.upload 进行包装。但是您提到这是伪代码,所以我假设您遗漏了您希望包含在对 s3.upload 的模块化调用中的逻辑(在此处包含它),但将处理响应的逻辑解耦(传入回调)。

    uploader = function(s3_options, cb) {
      s3.upload(s3_options, function(error,result){
        if(error){
          cb(error);
        }else{
          cb(null, result);
        }
      });
    };
    
    Template.contacts.events({
      'submit #updateContact': function(e,template){
    
        cb = function(error, uploadInfo) {
          formInfo = {name:$('[name=name]').val(),file:uploadInfo};
          Meteor.call('serverMethod',formInfo, function(e,r){
          if(e){
            // throw error message
          }else{
            // show success message
          }
        });
      uploader({file:inputFile, path:client}, cb);  // you don't show where `inputFile` or `client` come from
      }
    });
    

    【讨论】:

    • 谢谢。作品。我对模块化的追求比我想象的要多一些,但这有助于解决一些问题。我在它自己的函数中有 S3,但我是 return-ing 结果而不是调用另一个函数 cb=function() 让它等待 S3 的结果。谢谢。 (哦,我没问题,广泛使用回调。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    • 2013-11-06
    • 2013-07-12
    • 2020-04-20
    • 1970-01-01
    • 2019-09-02
    相关资源
    最近更新 更多