这可能是一个非常基本的问题,但是我真的陷在这种情况下,似乎无法通过实验找出答案:
我正在对某些数据执行http GET请求。我必须将这些数据显示在“组件”中,稍后我将不得不“访问”该数据(从http请求接收的数据)。
所以我必须将数据存储在两点上。我是否只需两次订阅从http GET请求返回的Observable?还是我必须订阅一次,将响应保存在某个地方,然后从保存的数据中馈入两个用例(组件和访问权限)。
如果我订阅了两次,是否有数据丢失的可能,因为第一个订阅触发了http GET,而第二个订阅“迟到了”?
如果这似乎含糊不清,请告诉我,我还将插入一些代码。
我正在使用@ angular / core 7.0.0和rxjs 6.3.3。
答案 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,并且所订阅的任何内容都会被更新。