Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Meteor使用meteorhacks:npm包异步运行方法_Javascript_Node.js_Meteor_Steam - Fatal编程技术网

Javascript Meteor使用meteorhacks:npm包异步运行方法

Javascript Meteor使用meteorhacks:npm包异步运行方法,javascript,node.js,meteor,steam,Javascript,Node.js,Meteor,Steam,我正在尝试使用Steam社区(steamcommunity)npm包以及meteohacks:npmMeteor包来检索用户的库存。我的代码如下: lib/methods.js: Meteor.methods({ getSteamInventory: function(steamId) { // Check arguments for validity check(steamId, String); // Require Steam Community module

我正在尝试使用Steam社区(
steamcommunity
)npm包以及
meteohacks:npm
Meteor包来检索用户的库存。我的代码如下:

lib/methods.js:

Meteor.methods({
  getSteamInventory: function(steamId) {
    // Check arguments for validity
    check(steamId, String);

    // Require Steam Community module
    var SteamCommunity = Meteor.npmRequire('steamcommunity');
    var community = new SteamCommunity();

    // Get the inventory (730 = CSGO App ID, 2 = Valve Inventory Context)
    var inventory = Async.runSync(function(done) {
      community.getUserInventory(steamId, 730, 2, true, function(error, inventory, currency) {
        done(error, inventory);
      });
    });

    if (inventory.error) {
      throw new Meteor.Error('steam-error', inventory.error);
    } else {
      return inventory.results;
    }
  }
});
client/views/inventory.js:

Template.Trade.helpers({
  inventory: function() {
    if (Meteor.user() && !Meteor.loggingIn()) {
      var inventory;
      Meteor.call('getSteamInventory', Meteor.user().services.steam.id, function(error, result) {
        if (!error) {
          inventory = result;
        }
      });

      return inventory;
    }
  }
});
尝试访问调用结果时,客户端或控制台上不会显示任何内容

我可以在
community.getUserInventory
函数的回调中添加
console.log(inventory)
,并在服务器上接收结果

相关文件:


您必须在
清单
助手中使用反应式数据源。否则,Meteor不知道何时重新运行它。您可以在模板中创建
ReactiveVar

Template.Trade.onCreated(function() {
  this.inventory = new ReactiveVar;
});
在帮助器中,通过获取其值来建立被动依赖关系:

Template.Trade.helpers({
  inventory() {
    return Template.instance().inventory.get();
  }
});
在Meteor.call中设置该值。顺便说一句,您不应该在助手内部调用该方法。有关详细信息,请参阅(过度工作助手一节)


您必须在
清单
助手中使用反应式数据源。否则,Meteor不知道何时重新运行它。您可以在模板中创建
ReactiveVar

Template.Trade.onCreated(function() {
  this.inventory = new ReactiveVar;
});
在帮助器中,通过获取其值来建立被动依赖关系:

Template.Trade.helpers({
  inventory() {
    return Template.instance().inventory.get();
  }
});
在Meteor.call中设置该值。顺便说一句,您不应该在助手内部调用该方法。有关详细信息,请参阅(过度工作助手一节)


我认为这里的问题是,您在getSteamInventoryMeteor方法中调用了一个异步函数,因此它总是在您实际得到community.getUserInventory调用的结果之前尝试返回结果。幸运的是,Meteor在这种情况下已经成功,因此您的方法简单地变成:

Meteor.methods({
  getSteamInventory: function(steamId) {
    // Check arguments for validity
    check(steamId, String);

    var community = new SteamCommunity();
    var loadInventorySync = Meteor.wrapAsync(community.getUserInventory, community);

    //pass in variables to getUserInventory
    return loadInventorySync(steamId,730,2, false);
  }
});
注意:我将
streamcommunity=Npm.require('streamcommunity')
移动到一个全局变量,这样我就不必在每次方法调用时都声明它


然后,您可以在客户机上调用此方法,就像chris概述的那样。

我认为这里的问题是,您在getSteamInventoryMeteor方法中调用了一个异步函数,因此,它总是在您实际从community.getUserInventory调用获得结果之前尝试返回结果。幸运的是,Meteor在这种情况下已经成功,因此您的方法简单地变成:

Meteor.methods({
  getSteamInventory: function(steamId) {
    // Check arguments for validity
    check(steamId, String);

    var community = new SteamCommunity();
    var loadInventorySync = Meteor.wrapAsync(community.getUserInventory, community);

    //pass in variables to getUserInventory
    return loadInventorySync(steamId,730,2, false);
  }
});
注意:我将
streamcommunity=Npm.require('streamcommunity')
移动到一个全局变量,这样我就不必在每次方法调用时都声明它


然后,您可以按照chris概述的方式在客户端上调用此方法。

我已经这样做了,并选择在
onCreated
回调中执行
Meteor.call
,但是我仍然没有在客户端上得到任何信息。我已经按照David Weldon的帖子中的建议回答了。我已经这样做了,并选择在
onCreated
回调中执行
Meteor.call
,但是我仍然没有从客户端获得任何信息。正如David Weldon的帖子中所建议的,我已经遵循了对的答案。Meteor.wrapAsync的小
over
meteorhacks:npm
版本的函数产生了所有的不同,再加上@chrisklaussner的其余答案:)这个小的
Meteor.wrapAsync
over
meteohacks:npm
的函数版本带来了所有的不同,再加上@chrisklaussner的其余答案:)