我正在制作一个MeteorJS应用程序,我从远程API中获取多个文件。
一个API记录可以包含多个文件 - 我想下载它们,保存在我的Media
集合中并检索其ID以存储到另一个集合中(例如NotMedia
):
// Client side: apiArr is an array with api json objects
for(var a in apiArr){
var pic1_id = Meteor.call('saveMedia', apiArr[a].image1_url);
var pic2_id = Meteor.call('saveMedia', apiArr[a].image2_url);
var collection = {
name: apiArr[a].name,
description: apiArr[a].desc,
image1_id: pic1_id,
image2_id: pic2_id
};
NotMedia.insert(collection);
}
我的流星方法:
//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
条记录时,image_id
是undefined
。我了解NotMedia
插入比保存图像文件更快完成,但如何同步/等待Meteor.calls
完成?
答案 0 :(得分:0)
看看这个:Stackoverflow&& Meteor.wrapAsync
wrapAsync就是你要找的。 p>
这是一个快速的代码段。希望这可以帮助。
Meteor.methods({
saveMedia: function(media) {
var asyncFunc = function(arg1, arg2, callback) {
var file = new FS.File();
file.attachData(media, function(err) {
if (err) {
callback(err, null);
}
file.origin_name = media;
var id = Media.insert(file);
callback(null, id);
});
};
return Meteor.wrapAsync(asyncFunc);
}
});
答案 1 :(得分:-1)
这里有两件事:
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);
});
}
});