我刚刚花了几个小时的答案,如SO阅读流星:调用Meteor.method内的异步函数,并返回结果
不幸的是,我还是没能用户的纤维,或为此事期货。
我试图做一些非常简单(我想!)。
当创建一个用户,一个变量添加到用户对象,基于异步方法的结果。 所以,想象一下,如果你将我的异步方法被称为所谓的银行第三方数据库服务器,这可能需要几秒钟的回报。
Accounts.onCreateUser(function(options,user){
var Fiber = Npm.require("fibers");
Fiber(function() {
BANK.getBalance(function(err, theBalance) {
if (err) return console.log(err);
_.extend(user,{
balance: theBalance;
});
});
}).run();
return user;
});
所以会发生什么在上面的是,该行方法被调用,而是由时间返回的代码已经移动并_.extend永远不会调用。
我试图把光纤内回电话,只有把事情弄得更糟:它永远不会返回用户。 那么它做到了,但那时3秒太晚了,所以一切的下游是想逃出来。
感谢您的任何帮助!
回答我的问题希望这将有助于在未来的一些人。 这是基于阿维塔尔奥利弗和大卫·格拉瑟的优秀建议,看看迈克·班尼斯特的meteor-async.md。 你可以在这里阅读: https://gist.github.com/possibilities/3443021
Accounts.onCreateUser(function(options,user){
_.extend(user,{
balance: getBalance(),
});
return user;
});
function getBalance() {
var Future = Npm.require("fibers/future");
var fut = new Future();
BANK.getBalance(function(err, bal) {
if (err) return console.log(err);
fut.return(bal);
});
return fut.wait();
}
我相信有一个更好的方式来处理这个问题,这是直接由故宫封装本身内期货包裹BANK API,按照本例(从阿维塔尔奥利弗): https://github.com/avital/meteor-xml2js -npm-演示/斑点/主/ xml2js-demo.js
我希望它能帮助!
使用this.unblock()在服务器端代码。
从流星1.0文档:“此客户端允许后续的方法,开始在一个新的fiber.On运行的服务器,从一个给定的客户端运行一次一个方法,从客户第n + 1的调用将无法启动,直到第N调用返回,但可以通过调用this.unblock改变这一点。这将使第N + 1的调用,开始在一个新的光纤运行“。
Meteor.methods({checkTwitter: function (userId) {
check(userId, String);
this.unblock();
try {
var result = HTTP.call("GET", "http://api.twitter.com/xyz",
{params: {user: userId}});
return true;
} catch (e) {
// Got a network error, time-out or HTTP error in the 400 or 500 range.
return false;
}
}});
方法调用使用同步样式(见“同步调用”这里http://docs.meteor.com/#meteor_call )在服务器端,这是在这个创建用户方法运行-你应该能够做到像
Accounts.onCreateUser(function(options, user) {
user.balance = Meteor.call('getBankBalance', params);
return user;
});
感谢哟这么多的工作,该解决方案及其对流星的项目好,因为默认安装的光纤模块。 地铁加NPM有这样的方法太 - > Meteor.sync。 对于任何项目的NodeJS有基于纤维的其它模块,它的名字是纤维
参考: https://github.com/goodeggs/fibrous