2

如果我将以下代码放在单个 Observable HQ 单元中,我会得到

data5 = TypeError: reading.map 不是函数

data5 = {
  const reading = FileAttachment("climate_graphs - china.csv").csv();
  reading.map(function(element) {
    return {"date": element["date"], "value": element["value"]}
  })
}

但是,如果我将它分成 2 个单元格,它会起作用:

// cell 1
reading = FileAttachment("climate_graphs - china.csv").csv();


// cell 2
data = reading.map(function(element) {
  return {"date": element["date"], "value": element["value"]}
})
4

1 回答 1

3

FileAttachment 的文档中,它指出这.csv()是一个异步方法FileAttachment

调用 FileAttachment 不会立即加载文件——内容仅在您请求时加载。这有点像 Fetch API:有异步方法以不同的形式返回文件的内容,例如 JSON、CSV 或 ArrayBuffer。您可以根据使用文件的方式选择适当的方法。

但是这个问题可能更清楚,因为在后一种情况下,您有 1 个单元格来读取文件/ 1 个单元格来处理数据;reading使用隐式async/读取并分配文件await。并且,如果您有需要await在块中指定的错误。

所以,这应该工作:

data5 = {
  // use await below
  const reading = await FileAttachment("climate_graphs - china.csv").csv();
  // 'reading' is now an array of objects so can use 'map'
  let mapping = reading.map(function(element) {
    return {"date": element["date"], "value": element["value"]}
  });
  return mapping;
}

通常,在 Promise简介中的文档中提到了具有这种 Promise 特定行为的单元格:

你看到承诺了吗?Observable 隐式等待跨越单元格边界的承诺,因此您通常不需要直接处理承诺。单元格可以返回承诺,而其他单元格可以简单地引用这些值,并且它们将在承诺解决时运行。

于 2021-08-14T05:21:51.167 回答