1

我已经开始将我们的 ArcGis JS 模板集成到我们正在使用的 webpack 构建管道中。

为了实现这一点,我们需要稍微重构一下 quiet 并需要开始使用 Esri-Loader ( https://github.com/Esri/esri-loader ),它本质上将 dojos 的 require 函数包装到一个 Promise 中。

一个非常简单的示例如下所示:

start = () => {
    return EsriLoader.loadModules(['esri/Map', 'esri/views/MapView', "esri/Basemap"])
        .then(([Map, MapView, Basemap]) => {
            const map = new Map({
                basemap: "streets"
              });

              const view = new MapView({
                map: map,
                container: "map"
              });
        });
}

起初我尝试编写这样的调用.then().then((Map, MapView, Basemap) => { ... },但收到以下编译器错误:

'(Map: any, MapView: any, Basemap: any) => void' 类型的参数不可分配给 '(value: any[]) => void | 类型的参数 许诺”。

好的,所以签名不加起来:

function loadModules(modules: string[], loadScriptOptions?: ILoadScriptOptions): Promise<any[]>;

所以正确的方法是像上面这样:.then(([Map, MapView, Basemap]) => { ... }

而此时我的理解已经到了极限。在下面的方法主体中,我可以调用它们的名字MapMapViewBaseMap我希望这是一个数组,我必须像 javascript-ish 一样访问它Arguments[0][0]Arguments[0][1]依此类推,因为我确实只传入了一个对象类型Array<any>

请向我解释为什么以及如何做到这一点,或者我在这里做错了什么。

4

1 回答 1

4

这叫做解构。

let [a, b, c] = result;

let a = result[0];
let b = result[1];
let c = result[2];

函数 args 也是如此

function ([a,b,c]) {
}

function (args) {
  let a = args[0];
  let b = args[1];
  let c = args[2];
}

您还可以进行对象解构:

let { a, b, c } = item;

如同:

let a = item.a;
let b = item.b;
let c = item.c;

在您的情况下,代码可以写成:

start = () => {
    return EsriLoader.loadModules(['esri/Map', 'esri/views/MapView', "esri/Basemap"])
        .then(modules => {
            const Map = modules[0];
            const MapView = modules[1];
            const Basemap = modules[2];
            const map = new Map({
                basemap: "streets"
              });

              const view = new MapView({
                map: map,
                container: "map"
              });
        });
}
于 2018-05-09T09:08:18.743 回答