Javascript console.log 中的数组长度不同?

Array different length in console.log at Javascript?

嘿嘿,我第一次在 js 中找到这个 我正在尝试将文件中的所有数据放入一个数组中。而且我查的时候有一个奇怪的地方,就是数组长度奇数。

这是我的代码

export function convertGISToGeojson(file) {
  if (file) {
    let geojson = [];

    var promise = new Promise(getBuffer(file));

    promise
      .then(function (data) {
        geojson = data;
        console.log(geojson);
      })
      .catch(function (err) {
        console.log("Error: ", err);
      });

    return geojson;
  } else {
    return null;
  }
}

function getBuffer(fileData) {
  return function (resolve) {
    var reader = new FileReader();
    var shapefile = require("shapefile");
    reader.readAsArrayBuffer(fileData);
    reader.onload = function () {
      let geojson = [];
      let result = reader.result;

      shapefile
        .open(result)
        .then((source) =>
          source.read().then(function log(result) {
            if (result.done) return;
            geojson.push(result.value);
            return source.read().then(log);
          })
        )
        .catch((error) => console.error(error.stack));

      resolve(geojson);
    };
  };
}

当我尝试 console.log(data) 那个变量时,结果是这样的 但是,当我尝试 console.log(data[0]) 时,结果是未定义的

我的代码有什么问题?

在里面试试console.log(data[0])

promise
  .then(function (data) {
    geojson = data;
    console.log(data[0])
    console.log(geojson);
  })

您的 convertGISToGeojsongetBuffer 函数没有按照您的预期执行,您返回的是一个空数组或 null,您没有等待 promise 解决或也解决早期,使用 async/await。我在下面的演示中包含了这两个函数:

function convertGISToGeojson(fileArrayBuffer) {

  return new Promise((resolve, reject) => {

    var reader = new FileReader();
    //var shapefile = require("shapefile"); // uncomment this
    reader.readAsArrayBuffer(new Blob([fileArrayBuffer], {
      type: "application/octet-stream"
    }))
    reader.onload = function(evt) {
      let result = reader.result;
      shapefile
        .open(result)
        .then((source) =>
          source.read().then(function log(result) {
            return source.read().then(i => resolve(i.value));
          })
        )
        .catch((error) => reject(error.stack));
    };
    reader.onerror = (event) => reject(reader.error);

  })

}


(async() => {

  let file = 'https://cdn.rawgit.com/mbostock/shapefile/master/test/points.shp';
  let fileBuffer = await fetch(file).then(res => res.arrayBuffer());

  convertGISToGeojson(fileBuffer)
    .then(info => console.log('info', info))
    .catch(err => console.log('err', err))

})()
<script src="https://unpkg.com/shapefile@0.6.6/dist/shapefile.js"></script>