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

标签 meteor node-fibers

我刚刚花了几个小时阅读了诸如 Meteor: Calling an asynchronous function inside a Meteor.method and returning the result 之类的答案。

不幸的是,我仍然没有设法使用光纤或 future 。

我正在尝试做一些相当简单的事情(我认为!)。

创建用户时,根据异步方法的结果向用户对象添加变量。所以想象一下,如果你会在名为 BANK 的 3rd 方数据库服务器上调用我的异步方法,这可能需要几秒钟才能返回。

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;

});

所以上面发生的事情是调用了 BANK 方法,但是当它返回时,代码已经移动了,并且 _.extend 从未被调用。

我尝试将返回调用放在 Fiber 中,这只会让事情变得更糟:它永远不会返回用户。嗯,确实如此,但为时已晚 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();
}

我相信有一种更好的方法来处理这个问题,即直接将 BANK API 包装在 npm 包本身中的 Futures 中,如以下示例(来自 Avital Oliver):https://github.com/avital/meteor-xml2js-npm-demo/blob/master/xml2js-demo.js

我希望它有帮助!

关于meteor - 如何从 Meteor 自己的回调调用异步方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16269507/

相关文章:

javascript - 如何仅在 Meteor 中不存在时插入

npm 错误!光纤@1.0.15 安装 : `node build.js || nodejs build.js`

javascript - 如何在 Node.js 中进行纤维化等待?

node.js - 追踪 meteor /Node 光纤中的堆栈溢出

javascript - meteor 光纤电子邮件

javascript - React + Meteor + Bootstrap Modal 管理数据

meteor - 使用铁路由器和 meteor 时如何添加事件?

javascript - Mongodb $inc 按变量

javascript - IronRouter waitOn、数据和 onAfterAction 困惑

javascript - 如何将异步函数调用包装到 Node.js 或 Javascript 中的同步函数中?