Meteor同步调用函数

Meteor synchronous call to function

本文关键字:函数 调用 同步 Meteor      更新时间:2023-09-26

祝您愉快。一直在绞尽脑汁想办法解决这个问题。

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

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

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

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

Psudo代码:

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文件信息更新数据库会使s3抽象更加复杂,因为它需要知道_id等等。。。

有什么想法吗?谢谢

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

如下所示,uploader函数除了包装s3.upload之外什么都不做。但您提到这是psudeocode,所以我认为您遗漏了希望包含在对s3.uploard的模块化调用中的逻辑(在此处包含它),但围绕处理响应解耦了逻辑(传入回调)。

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