在收集插入之前等待完成Meteor.call

时间:2015-11-25 08:36:14

标签: node.js asynchronous meteor async-await

我正在制作一个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_idundefined。我了解NotMedia插入比保存图像文件更快完成,但如何同步/等待Meteor.calls完成?

2 个答案:

答案 0 :(得分:0)

看看这个:Stackoverflow&& Meteor.wrapAsync

wrapAsync就是你要找的。

这是一个快速的代码段。希望这可以帮助。

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