Meteor.call() с возвращаемым значением, пока сервер работает асинхронно
Я работаю с Meteor и пытаюсь получить данные из внешней базы данных (neo4j для этого случая).
Моя проблема, когда я Meteor.call()
от клиента до сервера мне нужно иметь return
оператор в функции сервера. Но получение данных из базы данных само по себе асинхронно.
Это фрагмент того, что у меня есть:
client.js:
Template.test.created = function () {
Meteor.call('getData', id, function (error, response) {
if (response) {
console.log(response); //<-- reponse = "???"
}
});
}
server.js:
Meteor.methods({
"getData": function (id) {
neo.commit ( //<-- async function which expect a callback
id,
function(error, response) {
console.log(response); //<-- only here I have the response I want but now I cant "return" it.
return response;
}
);
return "???"; //<-- the actual return that is being send back
}
});
Есть идеи?
1 ответ
Решение
Ты можешь использовать Future
Чтобы исправить проблему, измените код на (может потребоваться больше изменений в зависимости от вашей базы кода):
...
var Future = Npm.require('fibers/future');
Meteor.methods({
"getData": function (id) {
var future = new Future();
neo.commit ( //<-- async function which expect a callback
id,
function(error, response) {
if (error) return future.throw(error);
return future.return(response);
}
);
return future.wait();
}
});
Вы можете узнать больше об асинхронных шаблонах Meteor по следующим ссылкам:
Асинхронизация на сервере Meteor
Метеоритные паттерны: вызов асинхронной функции и использование ее возвращаемого значения
Не стесняйтесь спрашивать, если вам нужна дополнительная помощь.