我正在努力理解GitHub上的Angular Google Maps (AGM) Library,特别是lazy-map-api-loader.ts
文件中的特定部分:
this.promise = new Promise<void>((resolve: Function, reject: Function) => {
(<any> window)[callbackName] = () => { // I've simplified this line a bit.
resolve();
};
script.onerror = (error: Event) => {
reject(error);
};
});
最终,上述承诺将返回给此方法的调用者;但是,我不理解的部分是上面看到的强制转换(?)(<any>window)[callbackName] =
语法。
看起来就像试图访问window
对象上的特定属性(名称等同于callback
的值)并将属性分配给函数将resolve
发现函数匿名定义的承诺。
但是,从我所看到的,分配给该属性的函数永远不会在存储库中调用。
上面发生了什么?
答案 0 :(得分:2)
<div id="template-example" style="display:none;">
<div>Foo: {bar}</div><div>Blah: {vtha}</div>
</div>
仅用于避免任何属性访问问题,因为<any>
上实际上不存在回调名称。使用括号语法是因为window
是变量。
这与:
相同callbackName
...但是如果你没有强制转换为this._windowRef.getNativeWindow().angular2GoogleMapsLazyMapsAPILoader
,这会导致类型错误。我的猜测是any
被使用,因为它更容易输入并且多次使用。
至于实际调用的时间,See the script tag construction会导致某些内容:
callbackName
一旦脚本完成加载,Google API本身就会调用此回调函数。该属性需要存在于<script src="https://googleapis.com/maps?callback=angular2GoogleMapsLazyMapsAPILoader"</script>
上才能被调用。