Ste*_*ual 4 meteor node-fibers
我刚刚花了几个小时读取了诸如Meteor之类的答案:在Meteor.method中调用异步函数并返回结果
不幸的是,我仍然无法管理用户光纤或期货.
我想做一些相当简单的事情(我想!).
创建用户时,根据异步方法的结果将变量添加到用户对象.因此,想象一下,如果您将在名为BANK的第三方数据库服务器上调用我的异步方法,这可能需要几秒钟才能返回.
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;
Run Code Online (Sandbox Code Playgroud)
});
所以上面发生的是调用BANK方法,但是当它返回时代码已经移动并且从不调用_.extend.
我尝试将返回调用放在光纤内部,这只会让事情变得更糟:它永远不会返回用户.好吧,但它已经过了3秒,所以到那时下游的一切都在拯救.
感谢您的任何帮助!
回答我自己的问题,希望将来可以帮助一些人.这是基于Avital Oliver和David Glasser的出色建议来看看Mike Bannister的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();
}
Run Code Online (Sandbox Code Playgroud)
我相信还有一种更好的方法可以解决这个问题,直接将BANK API包装在npm包本身的Futures中,如本例所示(来自Avital Oliver):https://github.com/avital/meteor-xml2js -npm-演示/斑点/主/ xml2js-demo.js
我希望它有所帮助!
| 归档时间: |
|
| 查看次数: |
3167 次 |
| 最近记录: |