# 扩展不完全懒加载导致空值无法正确转换字符串

**URL:** <https://forum.netlogo.org/t/topic/94>\
**Category:** Bug Reports\
**Tags:** extensions, zh\_CN\
**Created:** [April 9, 2024, 10:11am UTC](https://forum.netlogo.org/t/topic/94 "2024-04-09T10:11:13Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![maizi20](https://forum.netlogo.org/letter_avatar_proxy/v4/letter/m/8491ac/32.png) [@maizi20](https://forum.netlogo.org/u/maizi20)\
**Post date:** [April 9, 2024, 10:11am UTC](https://forum.netlogo.org/t/topic/94/1 "2024-04-09T10:11:13Z")

</div>

nlmap中定义了一个

```js
  // (Any) => Boolean
  isMap = function(x) {
    return x._type === "nl_map";
  };

```

导致null和undefined的字符串化只在声明了nlmap扩展的情况下报错  
`TypeError: Cannot read properties of undefined (reading '_type')`

不完全懒加载：  
指每次初始化后extensions/all中的扩展都会init一次但是不在nl中声明扩展就不导出prims和porter

```js
function() {
  // (C) Uri Wilensky. https://github.com/NetLogo/Tortoise
  var extensionPaths;

  extensionPaths = [
    'array',
    'bitmap',
    'csv',
    'encode',
    'dialog',
    'export-the',
    'fetch',
    'fp',
    'http-req',
    'import-a',
    'logging',
    'matrix',
    'mini-csv',
    'nlmap',
    'nt',
    'palette',
    'send-to',
    'sound',
    'store',
    'string',
    'table',
    // Followings are Turtle Universe extensions
    'plot',
    'tutorial',
    'widget',
    'workspace',
    'nettango',
    'sensor',
    'tune',
    'phys',
    'xr'
  ];

  module.exports = {
    initialize: function(workspace, ...importedExtensions) {
      var extensions, upperNames;
      upperNames = importedExtensions.map(function(name) {
        return name.toUpperCase();
      });
      extensions = {};
      extensionPaths.forEach(function(path) {
        var extension, extensionModule, upperName;
        extensionModule = require(`extensions/${path}`);
        extension = extensionModule.init(workspace);
        upperName = extension.name.toUpperCase();
        if (upperNames.includes(upperName)) {
          return extensions[upperName] = extension;
        }
      });
      return extensions;
    },
    porters: function(...importedExtensions) {
      var porters, upperNames;
      upperNames = importedExtensions.map(function(name) {
        return name.toUpperCase();
      });
      porters = [];
      extensionPaths.forEach(function(path) {
        var extensionModule, upperName;
        extensionModule = require(`extensions/${path}`);
        if (extensionModule.porter != null) {
          upperName = extensionModule.porter.extensionName.toUpperCase();
          if (upperNames.includes(upperName)) {
            return porters.push(extensionModule.porter);
          }
        }
      });
      return porters;
    }
  };

}

```

---

<div class="post-metadata">

**Author:** ![john-chen](https://forum.netlogo.org/user_avatar/forum.netlogo.org/john-chen/32/131_2.png) [@john-chen](https://forum.netlogo.org/u/john-chen)\
**Post date:** [April 9, 2024, 5:22pm UTC](https://forum.netlogo.org/t/topic/94/2 "2024-04-09T17:22:15Z")

</div>

这两者看起来是两个分开的问题？因果关系是啥？

---

<div class="post-metadata">

**Author:** ![tiaotiao](https://forum.netlogo.org/user_avatar/forum.netlogo.org/tiaotiao/32/21_2.png) [@tiaotiao](https://forum.netlogo.org/u/tiaotiao)\
**Post date:** [May 11, 2024, 5:28am UTC](https://forum.netlogo.org/t/topic/94/3 "2024-05-11T05:28:41Z")

</div>

再netlogo编译器中运行一段js后可以在控制台中使用任意扩展,而运行前不能…

---

<div class="post-metadata">

**Author:** ![john-chen](https://forum.netlogo.org/user_avatar/forum.netlogo.org/john-chen/32/131_2.png) [@john-chen](https://forum.netlogo.org/u/john-chen)\
**Post date:** [May 12, 2024, 8:06pm UTC](https://forum.netlogo.org/t/topic/94/4 "2024-05-12T20:06:06Z")

</div>

还是没明白上面这个问题具体怎么复现？
