我刚刚花了几个小时阅读了诸如 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/