2016-06-17 5 views
0

Я пытаюсь передать значение в обратном вызове метода асинхронного метеор. «MongoCollections» является глобальной переменнойМетод метеор не возвращается при передаче значения

// Async method 
let waiter = function(cb) { 
    setTimeout(() => { 
     cb(undefined, {data: 'test', other: mongoCollections}) 
    }, 1000); 
} 

// Meteor method 
Meteor.methods({ 
    'getCollections':() => { 
     let func = Meteor.wrapAsync(waiter); 
     let res = func(); 
     return res; 
    } 
}); 

На клиенте

Meteor.call('getCollections', (err, res) => { 
    console.log(err, res) 
}); 

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

Но если я удалю часть объекта «other: mongoCollections», тогда обратный вызов будет запущен. Почему отправка mongoCollections предотвращает увольнение обратного вызова? Если есть ошибка, как я могу ее поймать?

ответ

0

Я предполагаю, что вы теряете свой контекст между waiter() и исполнением cb(), что означает, что mongoCollections не определено в cb(), таким образом, вызов неудачен.

Попробуйте ввести mongoCollections в анонимной функции, что вы setTimeout для. Вероятно, он будет показан как undefined.

Или попробуйте так:

let waiter = function(cb) { 
    var _mongoCollections = mongoCollections; 
    setTimeout(() => { 
     cb(undefined, {data: 'test', other: _mongoCollections}) 
    }, 1000); 
} 

(который ставит mongoCollections в замыкании instsead)

Другая возможность (на основе комментариев ниже): объект Ваш mongoCollections не сериализации. Вы можете попробовать, зарегистрировав результат JSON.stringify(mongoCollections). Если это не удается, вам нужно извлечь часть требуемого объекта, чтобы мог быть сериализован.

+0

Благодарим за ответ: «mongoCollections» правильно регистрируется в терминале при запуске console.log (mongoCollections) в обратном вызове setTimeout. Фактически, когда я отправляю обратно «other: typeof _mongoCollections», клиент действительно регистрирует «объект», что является правильным, но удаление «typeof» снова останавливает обратный вызов от выполнения вообще. – wazzaday

+0

... что приводит к альтернативной возможности. Ответ обновлен. –

+0

спасибо, сериализуя объект работал. :) – wazzaday

0

Существует несколько вещей, которые могут произойти здесь, но я предполагаю, что ошибка происходит где-то, и сообщение об ошибке поглощается обработчиком где-то глубже.

Возможно, вы захотите использовать Meteor.setTimeout вместо ванили setTimeout как минимум. Посмотрите здесь: http://docs.meteor.com/api/timers.html#Meteor-setTimeout

Помимо этого, я хотел бы следовать рекомендациям предыдущего ответчика и попытаться убедиться, что mongoCollections настолько же глобальны, как вы думаете. Если единственным изменением между обратным вызовом, работающим и не работающим, является добавление одного символа, тогда виновник, скорее всего, не добавил ваш добавленный символ.

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