Javascript csv.js:53未捕获(承诺中)引用错误:[常量]未定义

Javascript csv.js:53未捕获(承诺中)引用错误:[常量]未定义,javascript,Javascript,以下是完整的代码: function id(file) { return new Promise((resolve, reject) => { reader = new FileReader(); reader.onload = function(e) { parsedLines = e.target.result.split(/\r|\n|\r\n/); resolve(parsedLines); }; reader.readA

以下是完整的代码:

function id(file) {
  return new Promise((resolve, reject) => {
    reader = new FileReader();
    reader.onload = function(e) {
      parsedLines = e.target.result.split(/\r|\n|\r\n/);
      resolve(parsedLines);
    };
    reader.readAsText(file);
  });
}

document.getElementById('fileInput').addEventListener('change', getReleasesFromFile);

function getReleasesFromFile(event) {
  const file = event.target.files[0]
  if (file === undefined) return

  parseFile(file).then(idsDirty => {
    const idsClean = idsDirty.filter(id => id.trim().length > 0)
    buildDocument(idsClean)
    console.log(idsDirty)
    console.log(idsClean)
  });
}

function parseFile(file) {
  return new Promise((resolve, reject) => {
    const reader = new FileReader();
    reader.onload = function (e) {
      parsedLines = e.target.result.split(/\r|\n|\r\n/)
      resolve(parsedLines)
    }
    reader.readAsText(file)
  })
}

async function buildDocument(idsClean) {
  const releaseData = []
  for (const id of idsClean) {
    const data = await getRelease(id)
    releaseData.push(data)
  }
  const text = releaseData.join('\n')
  saveCsv(text, 'output')
}

;(async function ( ) {
  const idsClean = []
  const accessInterval = 2400;
  let lastRequest = new Date - accessInterval;
  if(idsClean !== undefined) {
    for ( const id of idsClean ) { // Wait until one has passed since the previous request was initiated
      await new Promise( resolve => setTimeout( resolve, lastRequest + accessInterval - new Date() ) );
      try {
        lastRequest = new Date;
        const release = await getRelease( id );
      } catch ( err ) { // Handle request failure here,
        // Depending on the error, perhaps add another delay and retry
        // or loop up to some limit retrying on each iteration, increasing the delay each time you get a 429 error
        // At a minimum just log the skipped release id with console.log( id );
      } // end of catch
    } // end of for loop
  } // end of if statement
} )(); // end of async

function getRelease(id) {
  return fetch(`https://api.discogs.com/releases/${id}`,
    {
      headers: {
        'User-Agent': 'CSVforDiscogs/0.1',
      }
    })
    .then(response => response.json())
    .then(parseReleaseData)
  }

    function parseReleaseData(data) {
      if (data.message === 'Release not found.')
      return `Release with ID ${idFiltered} does not exist`

      const id = data.id
      const artists = data.artists ? data.artists.map(artist => artist.name) : []
      const title = data.title || []
      const format = data.formats[0].name || []
      const format_qty = data.formats[0].qty || []
      const format_descriptions = data.formats[0].descriptions || []
      const format_descriptions_formatted = format_descriptions.map(description => description.replace(/"/g, "\"\""))
      const label = data.labels[0].name || []
      const catno = data.labels[0].catno || []
      const identifiers = data.identifiers[0] || []
      const barcode = data.identifiers.filter((item) => item.type === 'Barcode')
      const barcode_values = barcode.map(barcode => barcode.value)
      const country = data.country || 'Unknown'
      const released = data.released_formatted || 'Unknown'
      const genres = data.genres || []
      const styles = data.styles || []
      const tracklist = data.tracklist ? data.tracklist.map(track => track.title) : []

      return [id, artists, title, label, catno, barcode_values, format, format_qty, '"' + format_descriptions_formatted + '"',
      country, released, '"' + genres + '"', '"' + styles + '"', '"' + tracklist + '"'].join(',')
    }

    function saveCsv(text, fileName) {
      const csvData = `data:text/csv;charset=utf-8,${text}`
      const encodedUri = encodeURI(csvData)
      const hiddenElement = document.createElement('a')
      hiddenElement.href = encodedUri
      hiddenElement.target = '_blank'
      hiddenElement.download = `${fileName}.csv`
      document.body.appendChild(hiddenElement)
      hiddenElement.click()
      hiddenElement.remove()
    }
我只是

csv.js:53未捕获(承诺中)引用错误:未定义idsClean

真正让我困惑的是,当我注释掉第二个
async
函数时,我没有得到任何错误。因此,我认为,
idsClean
很好。(我不确定这是否是正确的常数,但我尝试过的其他方法都不起作用。)有什么帮助吗?蒂亚


编辑:我将
const idsClean=[]
添加到
accessInterval”部分,这清除了我之前的错误。然而,每当我上传一个包含30行或更多行的文件时,我仍然会遇到一个
429`错误,因此我不确定该部分是否在做它应该做的事情。

idsClean
从未在您发布的代码中定义或分配。无论它是否“工作”,除非在其他地方定义,否则它只是一个错误。这意味着当调用
buildDocument
时,定义了
idsClean
,但当调用第二个异步函数时,未定义
idsClean
。如果这个提示对您的帮助还不够,请发布更多的代码,以便我们可以提供更多帮助。@Teun,谢谢,我大致理解,但我真的不知道如何修复它。我试过
;(异步函数(idsClean){const-accessInterval=1000;让lastRequest=new-Date-accessInterval;for(idsClean的const-id)
…但我得到了…>未捕获(承诺中)TypeError:idsClean不可用iterable@double-您现在已将
idsClean
添加为函数的参数,但查看其余的代码
idsClean
是在函数之外定义的。如果您可以编辑答案并发布文件的其余代码,我们可以进一步帮助您。好的,异步函数已经完成无法获取
idsClean
。您设置它的方式是,当导入/调用此文件时,会立即执行异步函数。我认为您必须使该函数与
buildDocument
函数类似,在需要时调用它,而不是立即调用,并以相同的方式传递
idsClean
idsClean
从未在您发布的代码中定义或分配。无论它是否“有效”或者不是,这只是一个错误,除非它是在其他地方定义的。这意味着当调用
buildDocument
时,定义了
idsClean
,但当调用第二个异步函数时,
idsClean
没有定义。如果这个提示对您帮助不够,请发布更多代码,以便我们可以提供更多帮助。@Teun,谢谢,我很抱歉理解,但我真的不知道如何修复它。我尝试了
;(异步函数(idsClean){const-accessInterval=1000;让lastRequest=new-Date-accessInterval;for(idsClean的const-id)
…但我得到了…>未捕获(承诺中)TypeError:idsClean不可用iterable@double-您现在已将
idsClean
添加为函数的参数,但查看其余的代码
idsClean
是在函数之外定义的。如果您可以编辑答案并发布文件的其余代码,我们可以进一步帮助您。好的,异步函数已经完成无法获取
idsClean
。您设置它的方式是,当导入/调用此文件时,会立即执行异步函数。我认为您必须使该函数与
buildDocument
函数类似,在需要时调用它,而不是立即调用,并以相同的方式传递
idsClean