角度可观察物

时间:2019-01-17 14:45:29

标签: angular rxjs

这可能是一个非常基本的问题,但是我真的陷在这种情况下,似乎无法通过实验找出答案:

我正在对某些数据执行http GET请求。我必须将这些数据显示在“组件”中,稍后我将不得不“访问”该数据(从http请求接收的数据)。

所以我必须将数据存储在两点上。我是否只需两次订阅从http GET请求返回的Observable?还是我必须订阅一次,将响应保存在某个地方,然后从保存的数据中馈入两个用例(组件和访问权限)。

如果我订阅了两次,是否有数据丢失的可能,因为第一个订阅触发了http GET,而第二个订阅“迟到了”?

如果这似乎含糊不清,请告诉我,我还将插入一些代码。

我正在使用@ angular / core 7.0.0和rxjs 6.3.3。

2 个答案:

答案 0 :(得分:3)

  

如果我订阅了两次,是否有数据丢失的可能,因为第一个订阅触发了http GET,而第二个订阅“迟到了”?

这取决于您的观察值是“热” 还是“冷” 。关于此主题有很多资源。但基本上,热门是多个观察者共享一个可观察对象,而是为每个订阅者创建一个新的观察对象。

Angular的httpClient.get使您可以观察到。这意味着,每次订阅时,您都会触发一个新的http请求

但是将可观察到的寒冷转变成热的事情真的很容易。您可以使用share运算符来实现。例如:

this.httpClient.get("https://google.com").pipe(share())

但是,这将导致“后期订阅者”错过通知。如果您有两个订阅者,并且希望他们都能保证收到通知,则可以使用shareReplay(1)

this.httpClient.get("https://google.com").pipe(shareReplay(1))

这将缓存最后一个通知,并将其通知给订阅时的每个订阅者,确保您只调用一次HTTP,每个订阅者都会得到结果。

答案 1 :(得分:1)

您最好的选择是创建一个与您的HTTP调用关联的function getTableHTMLFrom(array, hasHeaders) { if (!array || !array.length || !array[0].length) return ""; const headerString = (hasHeaders ? "<tr><th>" + array.shift().join("</th><th>") + "</th></tr>" : ""); const tdTag = "<td class=\"ui-state-default\">"; const bodyString = array.reduce(function (s, row) { s += "<tr>" + tdTag + row.join("</td>" + tdTag) + "</td></tr>"; return s; }, ""); return "<table>" + headerString + bodyString + "</table>"; } 。您可以使用一个功能启动HTTP调用,然后使用另一个功能预订值。因此,如果您不想这么做,您将不会总是触发HTTP调用。

示例:

$price = "INR 1,895.00";
$price=( (float) filter_var( $price, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION ) ); //outputs 1895

sudo adduser newuser

sudo mkdir -p /home/newuser/Desktop sudo mkdir -p /home/newuser/Documents sudo mkdir -p /home/newuser/.local/share/applications 将始终发出您订阅时具有的最后一个(或初始)值。因此,当您从任何组件进行订阅时,您将获得最后一个值,而从任何组件进行订阅时,您可以再次触发API,并且所订阅的任何内容都会被更新。