Javascript 需要一些异步调用的角度设计建议吗

Javascript 需要一些异步调用的角度设计建议吗,javascript,angular,Javascript,Angular,我需要一个帮助来设计一种允许我的Angular组件订阅js包装函数的方法 在下图中,您可以看到流程图 我正在创造一个有角度的正面,它必须与一个我无法触及的现有系统进行对话 该系统管理一个OpenLayer地图,并在其周围有一个JS包装器。我们可以在地图上操作,调用这个包装器,它具有诸如centerMap、refreshMap等功能 当MapManager.js拥有OpenLayer对象时,从其包装器中获取一些请求,调用读取PostGIS数据库的PHP服务器并返回要绘制的元素 为了与这个系统对话,

我需要一个帮助来设计一种允许我的Angular组件订阅js包装函数的方法

在下图中,您可以看到流程图

我正在创造一个有角度的正面,它必须与一个我无法触及的现有系统进行对话

该系统管理一个OpenLayer地图,并在其周围有一个JS包装器。我们可以在地图上操作,调用这个包装器,它具有诸如centerMap、refreshMap等功能

当MapManager.js拥有OpenLayer对象时,从其包装器中获取一些请求,调用读取PostGIS数据库的PHP服务器并返回要绘制的元素

为了与这个系统对话,我在Angular中创建了另一个包装器,以便在任何组件中使用它。我需要自己的包装器,因为最初的包装器是用纯JS编写的,我需要一个TS库

这个系统工作得很好。Angular能够在地图上操作。不幸的是,AngularWrapper是来自AngularComponent的同步调用,但不是来自MapManager.js,因为它必须对PHP服务器进行异步调用,所以当我的包装器结束调用时,映射仍在处理数据

例如:

我需要调用一个过滤器资源,然后将地图居中放置到找到的第一个。我需要知道是否没有找到带有过滤器的资源

内部包装器

如您所见,我必须设置一个超时,以等待服务器的异步调用结束。然后我可以调用getCurrentElements来获取过滤器调用的结果,取第一个,然后再次调用原始的_包装器来将OpenLayer映射集中到资源

如果没有超时,getCurrentElements将在调用旧元素之前返回元素。 超时是解决CENTERMAP问题的一个技巧,但AngularComponents仍然不知道发生了什么,也不知道过滤器的结果

在角度组件中,我只需导入函数即可调用过滤器:

组件

有没有一种方法可以创建某种可观察的服务,让角度组件知道发生了什么,或者打开一个包含一些信息的小吃栏?
在我目前的情况下,AngularComponents是不知道的。操作员可以在地图上看到一些更改,但不能看到AngularFrontend。

我只需向MapManager开发人员请求回调模式,就成功地解决了问题。 Javascirpt并没有丢失引用,所以我在AngularComponent上创建了一个函数来管理传递给我的包装器的结果,该结果由其他包装器接收,然后传递给MapManager。当mapmanager结束Ajax调用时,调用收到的任何回调


我很幸运,函数引用在内部调用过程中没有丢失。

什么是神秘的send方法?它返回什么?它是如何调用东西的?http呼叫?您还知道每个有效的.js文件都是有效的.ts文件,对吗?send方法不会返回任何东西。它只需通过同步调用调用mapmanager.js提供的map对象。例如:setMapCenterlon,lat{this.mapobject.applyRemoteSetCenter,arguments;}
function filterResources(filters)
{
    original_wrapper.send("filter",filters);        
    setTimeout(function()
    {
        var resources = original_wrapper.send("getCurrentElements",{});
        var first_one = array_shift(resources);
        original_wrapper.send("centerMap",{ "lat" : first_one.lat, "lon" : first_one.lon" });
        }
    },1000)   
}
import { filterResources } from '....assets/map/internalwrapper'; 

[...]

applyFilter()
{
    var params = {};
    [...]
    filterResources(params);
}