Meteor/Fibers - Как использовать обратный вызов Meteor.call?

У меня есть этот код, где я вызываю метод Meteor из клиента и ожидаю результата в обратном вызове. объект results — это правильно сформированный объект, который я могу преобразовать в строку и распечатать с консоли сервера.

Когда я запускаю этот код с допустимыми результатами и без ошибок, обратный вызов не вызывается на клиенте. Однако, если я заменю 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"
  }
]

person znat    schedule 08.10.2015    source источник
comment
попробуйте изменить return fut.wait() на fut.wait(); return fut.value;   -  person corvid    schedule 08.10.2015
comment
Конечно, result вместо results — это просто опечатка, верно?   -  person Tomasz Lenarcik    schedule 08.10.2015
comment
@apendua Конечно :)   -  person znat    schedule 08.10.2015
comment
Можете ли вы также сравнить объект results на сервере до и после трюка parse/stringify?   -  person Tomasz Lenarcik    schedule 09.10.2015
comment
Что вы имеете в виду под сравнением?   -  person znat    schedule 09.10.2015
comment
Можете ли вы добавить пример results или пролить свет на то, как он выглядит? Любая ошибка или индикация в консоли сервера?   -  person MasterAM    schedule 09.10.2015
comment
Я добавил JSON, который я пытаюсь передать в результате, к вопросу   -  person znat    schedule 09.10.2015
comment
Я могу вернуть этот объект из моего метода. Если вы вернете этот точный объект буквально, произойдет ли ошибка?   -  person MasterAM    schedule 09.10.2015
comment
@MasterAM Это именно мой вопрос: я передаю объект, вставляя его буквальное значение, это работает. Я упорядочиваю и анализирую «результаты», а затем передаю их, это работает. Но если я передаю «результаты», ничего не происходит, даже не возникает ошибка. Обратный вызов просто не вызывается на клиенте   -  person znat    schedule 09.10.2015
comment
Я бы начал с попытки клонировать его с помощью EJSON.clone() и посмотреть, возникают ли какие-либо исключения. Опять же, без актуального объекта я не могу воспроизвести.   -  person MasterAM    schedule 09.10.2015
comment
Давайте продолжим обсуждение в чате.   -  person MasterAM    schedule 09.10.2015


Ответы (1)


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

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

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

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

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

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

person MasterAM    schedule 09.10.2015
comment
Я добавил JSON, который я пытаюсь передать в результате, к вопросу - person znat; 09.10.2015
comment
@NathanZ, смотрите мои комментарии в чате. Надеюсь, что мы сможем разобраться с этим. Интересный тестовый случай. - person MasterAM; 09.10.2015