为什么异步 Meteor.call() 没有 return 任何东西

Why asynchronous Meteor.call() doesn't return anything

我在客户端有以下代码:

Meteor.call("getOldTests", m_user, test_id, course, language, function (error, result) {
            console.log("result: " + result);
            if (error) {
                Notifications.error(error.reason, 'We are working on this problem');
            } else {
                console.log(result);
                data.set(course, result);
            }

        });

其中服务器端有以下方法:

Meteor.methods({
    getOldTests: function (m_user, test_id, course, language) {
        var tests = Tests.findOne({email: m_user.email, course_en: course, test_id: test_id});
        if (tests) {
            console.log(tests);
            return Questions.find({course_en: course, variant: tests.variant, language: language});
        } else {
            return false;
        }
    },});

其中变量datareactive-dict

那么,为什么我的 Meteor.call() 函数在客户端没有执行任何内容(没有控制台输出),而实际上它调用了服务器端的方法(控制台输出中间结果)?

谢谢,

数据库提取和API 从服务器端调用应该包含在 Fiber 中。试试这个:

Future = Npm.require('fibers/future');
getOldTests: function (m_user, test_id, course, language) {
    var myFuture = new Future();
    var tests = Tests.findOne({email: m_user.email, course_en: course, test_id: test_id});
    if (tests) {
        console.log(tests);
        myFuture.return(Questions.find({course_en: course, variant: tests.variant, language: language}));
    } else {
        return false;
    }
 return myFuture.wait();
}

这个 question 可能会有帮助。

看起来您正在使用一种更适合发布-订阅的方法:

服务器:

Meteor.publish('getOldTests',function (m_user, test_id, course, language) {
  var tests = Tests.findOne({email: m_user.email, course_en: course, test_id: test_id});
  if (tests) return Questions.find({course_en: course, variant: tests.variant, language: language});
  else this.ready();
});

客户:

Meteor.subscribe('getOldTests',m_user, test_id, course, language);