流星同步调用功能

时间:2015-12-04 07:59:07

标签: javascript meteor amazon-s3

美好的一天。 为了解决这个问题,我一直在抨击这个问题。

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

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

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

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

Psudo代码:

id

我可以将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 } }); }); formInfo放在s3回调中,但这会导致更复杂的代码和更少的代码重用,而IMO这是代码重用的理想场所。

我尝试在有或没有回调的情况下将s3包装在其自己的功能中。我尝试过使用reactiveVars。我认为只用s3文件信息再次更新数据库会使s3抽象更复杂,因为它需要知道_id等...

有什么想法吗? 感谢。

1 个答案:

答案 0 :(得分:0)

If you are using javascript it's best to embrace callbacks! What is it about using callbacks like this that you do not like, or believe is modular or reusable?

As shown below the uploader function does nothing but wrap s3.upload. But you mention this is psudeocode, so I presume that you left out logic you want included in the modular call to s3.upload (include it here), but decouple the logic around handling the response (pass in a callback).

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
  }
});