【问题标题】:Javascript How to not to use global variables when creating arrays to access from different functionsJavascript 创建数组以从不同函数访问时如何不使用全局变量
【发布时间】:2018-06-12 18:19:49
【问题描述】:

我用 Papa Parse 读取了一些数据,并将结果回调到 unpack。我希望能够在其他函数中使用创建的数组。 (类似于console.log(unpack(data)) 之外的unpack

如何调用数组?

//read data from csv 
function parseData(file, callback) {
    Papa.parse(file, {
        download: true,
        complete: function(results) {           
            callback(results.data);
        }
    });
}

// want to use the created arrays in other functions.
function unpack(data) {
    var locations = [];
    var bsis = [];
    var lngs = [];
    var lats = [];

    for (var i = 0; i < data.length; i++) {
        locations.push(data[i][2]);
        bsis.push(data[i][3]);
        lats.push(data[i][4]);
        lngs.push(data[i][5]);
    }
    return [locations, bsis, lats, lngs];
}

我叫它

parseData("data/Runs/csvs/csvs_with_latlon/ShelterRun1.csv", unpack);

【问题讨论】:

  • parseData("…", function(data) { const result = unpack(data); console.log("outside of unpack:", result); })

标签: javascript parsing scope callback


【解决方案1】:

当你有回调时,你需要在那个时候处理它。

如果你不想使用全局,你只需要无限地嵌套函数:

const A = (a, callback) => callback(a+5)
const B = (r, callback) => callback(r + 5);

A(5, (r) => B(r, console.log))

没有办法从回调中返回它。

也就是说,您不必拥有真正的顶级全球。它可以是另一个函数内部的“全局”:

const A = (a, callback) => callback(a+5)
const B = (r, callback) => callback(r+5)

const run = () => {
  let result;
  
  A(5, r => B(r, r => { result = r }));
  
  setTimeout(() => console.log(result), 50);
}

run()

也就是说,因为回调是异步模式,你不能强制异步同步,所以要在回调之外使用全局,你仍然需要某种等待或其他异步模式检查结果。

【讨论】:

  • 使用外部范围变量是一个可怕的想法,会导致竞争条件
  • 确实如此。对于大多数事情,我不推荐它。如果您使用的是异步,则需要坚持使用异步。但这对于 React 或 Angular 之类的东西来说可能是一种可行的模式,它们只渲染可用的任何东西,并且您有不同的异步集,并且它何时从 null 切换到 not 都没关系。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-12
  • 1970-01-01
  • 2011-06-30
  • 1970-01-01
  • 2011-06-02
相关资源
最近更新 更多