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

Meteor Async Guide

Метеоритные паттерны: вызов асинхронной функции и использование ее возвращаемого значения

Не стесняйтесь спрашивать, если вам нужна дополнительная помощь.

Другие вопросы по тегам