从AMD回调返回值

问题描述

我正在使用基于require和异步模块定义的ArcGIS javascript API。要创建地图,请在AMD require语句的回调中定义所有操作:

require([
  "esri/Map","esri/views/MapView"
],function(Map,MapView){
   
  const map = new Map({ ... })
  const view = new MapView({ ... })
   
})

我希望能够在另一个模块的命令上初始化此行为,以及访问在AMD回调中定义的mapview对象。为了能够在命令上初始化此命令,我可以将其包装在一个函数中,然后导出该函数:

export const makeMap = () => {

   require([esri modules],MapView){
   
      map = new Map({ ... })
      view = new MapView({ ... })
   
   })

}

我可以将makeMap导入代码中的其他模块,然后调用它。这很好。但是,我试图弄清楚如何才能访问mapview对象,以便能够通过UI对其进行操作。首先,我尝试了这个:

// mapMap.js
export const makeMap = () => {

   let mapInstance;
   let viewInstance;

   require([esri modules],MapView){
   
      map = new Map({ ... })
      view = new MapView({ ... })

      mapInstance = map   
      viewInstance = view
   
   })

   return { mapInstance,viewInstance }

}

// some other module
import { makeMap } from './makeMap'

const { mapInstance,viewInstance } = makeMap()

这显然行不通-mapInstanceviewInstance未定义,因为在AMD回调中定义它们的函数在之后运行,它们从{{1 }}。

我不确定如何从AMD回调中获取返回值。这可能吗?我需要另一个范例吗?

我尝试的另一件事是传递引用持有人对象,将引用应用于该对象,然后在需要时从那里检索它们。它可以工作,但是我觉得它不那么干净:

makeMap()

我看过How do I return the response from an asynchronous call?,它是关于从ajax调用中重新调整值,但我正努力将其与AMD回调相关联。

是否可以从AMD回调中返回要在其他地方使用的值?我希望使用// maprefs.js export const maprefs = {} // makeMap.js import { maprefs } from './maprefs' export const makeMap = (maprefs,mapname) => { require([esri modules],MapView){ map = new Map({ ... }) view = new MapView({ ... }) maprefs[mapname] = { map,view } }) } // some module import { maprefs } from './maprefs' import { makeMap } from './makeMap' makeMap(maprefs,"map1") someButton.addEventListener('click',() => { // maprefs.map1 is properly defined as { mapInstance,viewInstance } and I can take action on it maprefs.map1.doSomething }) 类型的语法。

解决方法

在您提到的情况下,我认为最好的解决方案是使用esri-loader。是ESRI为此目的而专门构建的一个小型库,即在运行时加载ArcGIS JS API库模块。

ArcGIS Docs - esri-loader

Github ESRI - esri-loader usage

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...