问题描述
我正在使用基于require
和异步模块定义的ArcGIS javascript API。要创建地图,请在AMD require
语句的回调中定义所有操作:
require([
"esri/Map","esri/views/MapView"
],function(Map,MapView){
const map = new Map({ ... })
const view = new MapView({ ... })
})
我希望能够在另一个模块的命令上初始化此行为,以及访问在AMD回调中定义的map
和view
对象。为了能够在命令上初始化此命令,我可以将其包装在一个函数中,然后导出该函数:
export const makeMap = () => {
require([esri modules],MapView){
map = new Map({ ... })
view = new MapView({ ... })
})
}
我可以将makeMap
导入代码中的其他模块,然后调用它。这很好。但是,我试图弄清楚如何才能访问map
和view
对象,以便能够通过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()
这显然行不通-mapInstance
和viewInstance
未定义,因为在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库模块。