【问题标题】:Wait for completing Meteor.call before collection insert在集合插入之前等待完成 Meteor.call
【发布时间】:2015-11-27 22:18:50
【问题描述】:

我正在制作一个 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);
}

我的 Meteor 方法:

//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 完成?

【问题讨论】:

标签: node.js asynchronous meteor async-await


【解决方案1】:

看看这个:Stackoverflow && Meteor.wrapAsync

wrapAsync 就是你要找的。​​p>

这是一个快速代码 sn-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);
  }
});

【讨论】:

  • 你的答案可能是对的,但你可以通过给出示例代码来改进它。
  • 我用各种方式尝试了Meteor.wrapAsync,但没有成功 - 代码示例会很棒
【解决方案2】:

这里有两个问题:

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

【讨论】:

  • 我试过这个“回调地狱”,但效果不好,所以我决定问这个问题..
  • 编辑了我的答案.. 我看到了问题。不要在方法中使用异步操作。
猜你喜欢
  • 2017-02-02
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
  • 2017-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多