繁体   English   中英

流星同步调用功能

[英]Meteor synchronous call to function

美好的一天。 为了解决这个问题一直在争吵。

简而言之,我有一个表单,该表单具有许多文本输入以及一个输入文件元素,用于将所述文件上传到AWS S3(通过lepozepo:s3 ver5.1.4包)。 关于此程序包的好处是不需要服务器,因此可以控制资源。

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

因此,回到表格。 我需要将返回的AWS URL与其他表单数据一起放入数据库。 但是,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包装在自己的函数中,并包含和不包含回调。 我试过使用reactVars。 我认为仅使用s3文件信息来更新数据库将使s3抽象更加复杂,因为它需要知道_id等等。

有任何想法吗? 谢谢。

如果您使用的是JavaScript,则最好包含回调! 使用您不喜欢或认为是模块化或可重用的此类回调有什么用?

如下所示,上uploader功能除了包装s3.upload外什么也不做。 但是您提到这是psudeocode,因此我假设您省略了要包含在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
  }
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM