流星补偿异步

时间:2014-01-01 00:56:24

标签: javascript node.js asynchronous meteor

我正在尝试在Meteor中创建一个读取文件并输出结果的方法。以下是我的代码。

服务器:

Meteor.methods({

retTemplate: function(templateName){

    var fs = Npm.require('fs');
    var ret;
    fs.readFile("./../../../../../client/" + templateName + ".html",{encoding: 'utf8'}, function(err, data) {

    if(err)
        return "ERROR";

    console.log(data);

    return data;
    }); 

  }
});

客户:

    Meteor.call('retTemplate', submitName, Meteor.user(), function(e, r){
      console.log(r);
      $('#editTempData').val(r);
    });

服务器端的代码工作(服务器端控制台使用html文件的内容更新),但该方法返回undefined给客户端。我相信这是由于Meteor的异步功能。有没有解决的办法?我一直在摆弄有点无济于事。

感谢。

编辑:我认为如果没有调用readFile方法会有效,因为这会设置一些双异步调用,这可能是问题,但我不知道如何修复它。

2 个答案:

答案 0 :(得分:1)

您无法从异步方法返回值,然后将其返回到客户端。这是另一种(但不是理想的)解决方案。

在客户端/服务器上创建new Meteor.Collection,只需订阅订阅/发布此集合即可。将从fs.readFile()返回的数据保存到您的收藏中,并在发生这种情况时自动通知您的客户。

答案 1 :(得分:1)

我找到了答案。我需要使用期货。

工作服务器:

Meteor.methods({

retTemplate: function(templateName){


    var Future = Npm.require('fibers/future');
    var fut = new Future();
    var fs = Npm.require('fs');
    var ret;
    fs.readFile("./../../../../../client/" + templateName + ".html",{encoding: 'utf8'}, function(err, data) {

    if(err)
        return "ERROR";

    console.log(data);
    fut['return'](data);

    }); 
    return fut.wait();


  }
});