Meteor使用Method.call在函数范围外返回的值

时间:2016-09-05 06:22:21

标签: javascript meteor

  

在下面的代码中,res是一个二维数组,用于处理服务器返回的.csv数据。

var result;
Meteor.call('parseFile', (err, res) => {
    if (err) {
        alert(err);
    } else {
        // success!
        alert(res[0][0]);
        result = res
    }
});
let longitude = result[0];

我正在使用上面的代码。并且存储在result变量中的值为null。但是,在alert中,变量res具有存储在其中的值。我在网上搜索,他们说这是由于某些纤维的东西,并建议使用会话变量。但是,我也无法做到这一点。所以,我的问题基本上是如何使用存储在res变量中的服务器返回的数组在函数范围之外使用。

3 个答案:

答案 0 :(得分:0)

这是一个典型的异步调用问题。请参阅:How do I return the response from an asynchronous call?

通常的方法是在该任务的回调中放置任何依赖于异步任务结果的指令(如let longitude = result[0])。

在Meteor客户端代码中,您还可以在反应范围内编写说明(例如在Blaze助手中,或使用Tracker.autorun() / Blaze模板this.autorun(),使用Reactive Variable为您的result。这样,一旦Meteor.call() 设置,您的反应范围就会重新运行,这次使用更新后的值。

答案 1 :(得分:0)

您应该为此目的使用反应变量refer here for better insights

答案 2 :(得分:0)

请参阅以下示例 在html文件上添加以下适当的更改

<template name="test">
    <!-- Here is where you want your data -->
    <p>{{test}}</p>
</template>

在js文件中添加以下

Template.test.onCreated(function() {

  this.test= new ReactiveVar();

  Meteor.call('parseFile', (err, res) => {
    if (err) {
      console.error(err);
    } else {
      // Set data into a reactive variable
      this.test.set(res);
    }
  });
});

Template.test.helpers({
  test: function() {
    // Helper will automatically rerun on method res
    return Template.instance().test.get();
  }
});