Meteor.call() 具有 return 值,而服务器具有异步工作

Meteor.call() with return value while server have async work

我正在使用 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
    }
});    

有什么想法吗?

您可以使用 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 异步模式的更多信息:

Async On Meteor Server

Meteor Async Guide

Meteor Patterns: Call an asynchronous function and use its returned value

随时询问您是否需要进一步的帮助。