Meteor.call和延迟补偿

时间:2015-05-27 22:03:08

标签: meteor

我试图理解为什么在调用流星服务器方法时出现错误。它在服务器端工作,但它在浏览器中抛出错误。

这是 /server/methods.js 文件中的服务器代码:

Meteor.methods({
    getTicketSettings: function(){
        var getTicketConfig = function(callback){
            Assets.getText('ticketCustomizing.json', function(error, res){
                if (error)
                    throw new Meteor.Error({error:'ticket-getCustomizing', reason:'No se pudo recuperar la configuración.'});
                else callback && callback(null, JSON.parse(res));
            });
        }

        var syncAssetRetrieve = Meteor.wrapAsync(getTicketConfig);
        var result = syncAssetRetrieve();
        return result;
    },
});

这是我在 /lib/initialization.js 文件中的客户端/服务器代码:

App.config.tickets.tipos = new Mongo.Collection('tipos');

Meteor.startup(function(){
    moment.locale('es');

     var ticketSettingsObj = Meteor.call('getTicketSettings');
     console.log(ticketSettingsObj);

     _.map(ticketSettingsObj.tipos, function(tipo){
         App.config.tickets.tipos.insert(tipo);
     });
});

当我运行我的应用程序时,我在控制台中记录了JSON对象,但浏览器显示此错误:未捕获TypeError:无法在 / lib中读取未定义的属性“tipos” /initialization.js 这里:

_.map(ticketSettingsObj.tipos, function(tipo){
         App.config.tickets.tipos.insert(tipo);
     });

显然我误解了一些东西,但仍然在想......

2 个答案:

答案 0 :(得分:2)

您需要将回调传递给Meteor.call。服务器可以同步运行它,阻塞直到它返回,但客户端不能这样,所以ticketSettingsObj将始终未定义。

请参阅Meteor docs

没有错误处理(和未经测试):

Meteor.call('getTicketSettings', function(error, result){
  console.log(result);
  _.map(result.tipos, function(tipo){
     App.config.tickets.tipos.insert(tipo);
 });
});

答案 1 :(得分:1)

执行package expo; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.JFrame; import javax.swing.JPanel; public class Expo extends JPanel implements KeyListener{ int x = 0; int y = 0; @Override public void keyTyped(KeyEvent e) { //System.out.println("Key Typed"); } @Override public void keyPressed(KeyEvent e) { if(e.getKeyCode() == KeyEvent.VK_DOWN){ System.out.println("Key Pressed" + e.getKeyCode()); y = y + 2; } } @Override public void keyReleased(KeyEvent e) { //System.out.println("Key Released"); } public void paint(Graphics g){ g.setColor(Color.BLUE); g.drawRect(x ,y,100,100); repaint(); } public static void main(String[] args) throws InterruptedException { Expo expo = new Expo(); JFrame f = new JFrame(); f.setVisible(true); f.setSize(500,500); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.addKeyListener(expo); f.add(expo); f.repaint(); } } 并查看它是否返回有效对象。如果它没有,那么您只在服务器端定义了对象console.log(App.config.tickets)。如果这是故意的,并且您只希望在服务器端访问它,那么添加App.config.tickets或将其定义移动到if(Meteor.isServer)目录中的文件。