TypeScript中为何.then()接收的数组元素可按名称访问?
为什么Esri-Loader的then回调要用数组解构访问模块?
这个问题其实涉及ES6数组解构语法和Promise的返回值处理,我来给你拆解清楚:
核心原因:Esri-Loader返回的Promise会resolve一个模块数组
esriLoader.loadModules()方法内部封装了Dojo的require,但它把Dojo的多参数回调转换成了返回数组的Promise——当Promise完成时,它会把你请求的所有模块按传入的顺序打包成一个数组返回。
比如你调用:
esriLoader.loadModules(["esri/Map", "esri/views/MapView", "esri/Basemap"])
最终resolve的结果是一个数组:[Map构造函数, MapView构造函数, Basemap构造函数]。
为什么直接写(Map, MapView, Basemap)会报错?
JavaScript中,Promise的then回调只会接收一个参数(也就是上述的模块数组)。你尝试的写法(Map, MapView, Basemap)其实是JavaScript的逗号运算符在起作用:
Map会被赋值为整个模块数组MapView和Basemap则会被赋值为undefined(因为逗号运算符只会返回最后一个表达式的值,但这里没有对应的值传入)
这就导致你后续代码中使用MapView或Basemap时,本质上在操作undefined,自然触发编译或运行时错误。
数组解构的作用:让你直接按名称访问模块
ES6的数组解构语法([Map, MapView, Basemap])就是为了简化数组元素的提取而设计的,它等价于手动从数组中按索引取值:
.then((modules) => { const Map = modules[0]; const MapView = modules[1]; const Basemap = modules[2]; // 你的业务代码 });
解构写法更简洁、可读性更高,让你能直接用变量名访问每个模块,不用再写繁琐的数组索引。
补充:Esri-Loader的封装逻辑
底层Dojo的require是支持多参数回调的(每个模块对应一个回调参数),但Esri-Loader为了适配Promise的单值resolve特性,把多个模块打包成一个数组返回,所以必须用解构来提取单个模块对象。
内容的提问来源于stack exchange,提问作者Marco
相关产品推荐
相关产品推荐

