Node.js 请等待完成Meteor.call,然后再插入集合
我正在制作一个MeteorJS应用程序,从远程API获取多个文件 一个API记录可以有多个文件-我想下载它们,保存在我的媒体集合中,并检索它们的id以存储到另一个集合中,例如NotMedia: 我的流星法:Node.js 请等待完成Meteor.call,然后再插入集合,node.js,asynchronous,meteor,async-await,Node.js,Asynchronous,Meteor,Async Await,我正在制作一个MeteorJS应用程序,从远程API获取多个文件 一个API记录可以有多个文件-我想下载它们,保存在我的媒体集合中,并检索它们的id以存储到另一个集合中,例如NotMedia: 我的流星法: //Server side: Meteor.methods({ saveMedia: function(media){ var file = new FS.File(); file.attachData(media, function(err){ if(err
//Server side:
Meteor.methods({
saveMedia: function(media){
var file = new FS.File();
file.attachData(media, function(err){
if(err){
throw err;
}
file.origin_name = media;
var id = Media.insert(file);
return id;
});
},
});
但当我检索保存的NotMedia记录时,图像id未定义。我知道NotMedia插入比保存图像文件更快完成,但我如何同步/等待Meteor.calls完成?看看这个:&&
wrapAsync是您正在寻找的
下面是一个快速的代码片段。希望这有帮助。
流星法{
saveMedia:functionmedia{
var asyncFunc=functionarg1,arg2,回调{
var file=new FS.file;
file.attachDatamedia,函数错误{
如果出错{
callbackerr,null;
}
file.origin_name=介质;
var id=Media.insertfile;
callbacknull,id;
};
};
return Meteor.wrapAsyncasyncFunc;
}
}; 这里有两个问题:
1如果对服务器上定义的方法使用Meteor.call,Meteor.call将返回undefined,因为它正在异步调用该方法。对于服务器端方法上的Meteor.call,必须提供回调函数
2看起来您正在服务器端调用一个异步函数,但您不能这样做
Meteor.methods({
saveMedia(media) {
let file = new FS.File();
// this takes a callback func.. that tells me this is asynchronous - bad!
file.attachData(media, function (err) {
if (err) {
throw err;
}
file.origin_name = media;
return Media.insert(file);
});
}
});
你可以用承诺来做到这一点:我尝试过这个“回调地狱”,但效果不好,所以我决定问这个问题..编辑我的答案。。我明白问题所在。不要在方法中使用异步操作。你的答案可能是正确的,但你可以通过给出示例代码来改进它。我用各种方法尝试了Meteor.wrapAsync,但没有成功-代码示例将非常好
Meteor.methods({
saveMedia(media) {
let file = new FS.File();
// this takes a callback func.. that tells me this is asynchronous - bad!
file.attachData(media, function (err) {
if (err) {
throw err;
}
file.origin_name = media;
return Media.insert(file);
});
}
});