如何调用从流星自己的回调异步方法?(How to call async method from Me

2019-09-01 08:13发布

我刚刚花了几个小时的答案,如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秒太晚了,所以一切的下游是想逃出来。

感谢您的任何帮助!

Answer 1:

回答我的问题希望这将有助于在未来的一些人。 这是基于阿维塔尔奥利弗和大卫·格拉瑟的优秀建议,看看迈克·班尼斯特的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

我希望它能帮助!



Answer 2:

使用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;
 }

}});



Answer 3:

方法调用使用同步样式(见“同步调用”这里http://docs.meteor.com/#meteor_call )在服务器端,这是在这个创建用户方法运行-你应该能够做到像

Accounts.onCreateUser(function(options, user) {
  user.balance = Meteor.call('getBankBalance', params);
  return user;
});


Answer 4:

感谢哟这么多的工作,该解决方案及其对流星的项目好,因为默认安装的光纤模块。 地铁加NPM有这样的方法太 - > Meteor.sync。 对于任何项目的NodeJS有基于纤维的其它模块,它的名字是纤维

参考: https://github.com/goodeggs/fibrous



文章来源: How to call async method from Meteor own callbacks?