2015-10-08 5 views
2

У меня есть этот код, где я вызываю метод Meteor от клиента и ожидаю результата в обратном вызове. объект results - это хорошо сформированный объект, который я могу выполнить и распечатать с консоли сервера.Метеор/Волокна - Как использовать обратный вызов Meteor.call?

Когда я запускаю этот код с допустимыми результатами и без ошибок, обратный вызов не вызывается на клиенте. Однако, если я заменю fut.return(results) на fut.return(JSON.parse(JSON.stringify(results))), вызывается обратный вызов и я получаю «строку» в клиенте. Любая идея, почему я могу вернуть строку, но не объект?

код сервера (в Meteor.Methods()):

getUserEvents : function(userId,start,end) { 
     var fut = new Future(); 
     getUserEventsPrivate(userId,start,end,function(err,results){ 
      if(err){ 
       fut.throw(new Meteor.Error(500, 'Oops, something wrong happened')); 
      }else{ 
       fut.return(results); // works when fut.return(JSON.parse(JSON.stringify(results))); 
      } 
     }); 
     return fut.wait(); 
    } 

Клиент:

Meteor.call('getUserEvents',Meteor.user()._id, startStr, endStr,function(err,results){ 
    console.log(results); 
}); 

EDIT вот Json я пытаюсь передать как 'результаты':

[ 
    { 
    "title": "ResponsiveMTL #1", 
    "start": "2015-10-13T21:30:00.000Z", 
    "end": "2015-10-14T00:30:00.000Z" 
    }, 
    { 
    "title": "Meteor Global Distributed Hackathon", 
    "start": "2015-10-10T15:00:00.000Z", 
    "end": "2015-10-11T15:00:00.000Z" 
    }, 
    { 
    "title": "retenues a la source", 
    "start": "2015-10-08T19:25:00.275Z", 
    "end": "2015-10-08T19:25:00.275Z" 
    }, 
    { 
    "title": "Salsa", 
    "start": "2015-09-19T22:00:00.000Z", 
    "end": "2015-09-19T23:00:00.000Z" 
    }, 
    { 
    "title": "Salsa", 
    "start": "2015-10-09T22:00:00.000Z", 
    "end": "2015-10-09T23:00:00.000Z" 
    } 
] 
+0

попробуйте изменить 'return fut.wait()' на 'fut.wait(); return fut.value; ' – corvid

+0

Конечно,' result' вместо 'results' - это просто опечатка, правильно? –

+0

@apendua Конечно :) – znat

ответ

1

Это вполне возможно чтобы вернуть объект таким образом.

Ваш объект, вероятно, не является сериализованным по EJSON, хотя его трудно сказать, не глядя на образец.

Если, например, ваши объекты содержат круглые ссылки, EJSON будет бесшумно терпеть неудачу, и ваш обратный вызов не будет вызван. Маловероятно, что это так, поскольку вы можете заставить JSON сериализовать его.

Вы можете попытаться найти оскорбительные свойства и изменить их, но может быть неплохо зарегистрировать его как пользовательский тип с помощью EJSON.

http://docs.meteor.com/#/full/ejson_add_type

Во всяком случае, было бы интересно увидеть ваши реальные объекты и быть в состоянии сказать больше.
Какую версию Meteor вы используете?

+0

Я добавил JSON. Я пытаюсь передать в результате вопрос – znat

+0

@NathanZ, см. Мои комментарии в чате. Надеюсь, что мы сможем разобраться в этом. Интересный тестовый пример. – MasterAM

Смежные вопросы