试图用javascript重播GPX路由,但却在努力延迟航路点

试图用javascript重播GPX路由,但却在努力延迟航路点,javascript,node.js,rxjs,Javascript,Node.js,Rxjs,我有许多GPX文件,其中包含要在node.js脚本中重播的路由。这是为了支持测试一个地理应用程序,所以我想用与捕获路线时相同的时间差重播路线点。例如,如果我有这样一个文件: <?xml version="1.0" encoding="UTF-8"?> <gpx version="1.1" creator="Runkeeper - http://www.runkeeper.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema

我有许多GPX文件,其中包含要在node.js脚本中重播的路由。这是为了支持测试一个地理应用程序,所以我想用与捕获路线时相同的时间差重播路线点。例如,如果我有这样一个文件:

<?xml version="1.0" encoding="UTF-8"?>
<gpx
  version="1.1"
  creator="Runkeeper - http://www.runkeeper.com"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns="http://www.topografix.com/GPX/1/1"
  xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd"
  xmlns:gpxtpx="http://www.garmin.com/xmlschemas/TrackPointExtension/v1">
<trk>
  <name><![CDATA[Running 7/9/13 5:12 pm]]></name>
  <time>2013-07-09T22:12:45Z</time>
<trkseg>
<trkpt lat="46.414311000" lon="-94.356703000"><ele>386.7</ele><time>2013-07-09T22:12:45Z</time></trkpt>
<trkpt lat="46.414328000" lon="-94.356708000"><ele>386.0</ele><time>2013-07-09T22:12:46Z</time></trkpt>
<trkpt lat="46.414404000" lon="-94.356637000"><ele>385.6</ele><time>2013-07-09T22:12:49Z</time></trkpt>
<trkpt lat="46.414486000" lon="-94.356562000"><ele>385.4</ele><time>2013-07-09T22:12:52Z</time></trkpt>
...
这让我们用少量代码延迟每个数据点,但只延迟固定数量,而不使用每个航路点之间的间隔。我试图用一个变量来替换
1000
,我可以在处理数据点时使用它,但它还不能工作

有没有其他方法可以使用可观察(或其他)来获得这种行为

我看到js实际上并不意味着同步工作,但我在C#上花了很多时间,所以我并不反对使用它,但是我希望了解一些新的东西:)

您可以使用和操作员发出以前和当前的航路点,然后可以使用操作员进行适当延迟的观测:

const航路点=Rx.Observable.from([{
拉脱维亚:46.414311000,
lon:-94.356703000,
时间:Date.parse(“2013-07-09T22:12:45Z”)
}, {
拉脱维亚:46.414328000,
lon:-94.356708000,
时间:Date.parse(“2013-07-09T22:12:46Z”)
}, {
拉脱维亚:46.414404000,
lon:-94.356637000,
时间:Date.parse(“2013-07-09T22:12:49Z”)
}, {
拉脱维亚:46.414486000,
lon:-94.356562000,
时间:Date.parse(“2013-07-09T22:12:52Z”)
}]);
常数回放=航路点
.startWith(空)
.成对
.concatMap(([previous,current])=>previous?
可观测的(当前)延迟(当前时间-前一时间):
Rx.可观测的(电流)
)
.subscribe(航路点=>console.log(航路点))
。作为控制台包装{最大高度:100%!重要;顶部:0;}

我知道会有一些rxjs操作符组合可以做到这一点。谢谢你的主意!事实上,这似乎没有达到我的期望。它适用于前几个航路点,但随后它会反复发射最后一个航路点。您可以在代码段中看到,第三个航路点从未发射,但最后一个航路点发射了两次。在我的大文件中,最后一个航路点被发射了很多次。更新了代码段以不改变状态-这似乎是问题所在。我再次更新了它。如果使用和,则更简单。
    // waypoints is an array of the ... waypoints
    //
    Observable.from(waypoints)
        .zip(Observable.timer(0, 1000), x => x)
        .subscribe(async waypoint => {
            // await'ing firebase stuff
        });