[英]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
}
});
});
我可以将formInfo
和Meteor.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.