为什么异步 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;
}
},});
其中变量data
为reactive-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);
我在客户端有以下代码:
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;
}
},});
其中变量data
为reactive-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);