如何从Meteor自己的回调中调用异步方法?

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秒,所以到那时下游的一切都在拯救.

感谢您的任何帮助!

Ste*_*ual 5

回答我自己的问题,希望将来可以帮助一些人.这是基于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

我希望它有所帮助!