Node.js 请等待完成Meteor.call,然后再插入集合

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

我正在制作一个MeteorJS应用程序,从远程API获取多个文件

一个API记录可以有多个文件-我想下载它们,保存在我的媒体集合中,并检索它们的id以存储到另一个集合中,例如NotMedia:

我的流星法:

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