Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 2通过按钮订阅/取消订阅_Angular_Observable - Fatal编程技术网

Angular 2通过按钮订阅/取消订阅

Angular 2通过按钮订阅/取消订阅,angular,observable,Angular,Observable,我正在检查互联网连接。每当连接丢失时,我想向用户显示一个警报,如果用户单击刷新按钮,我想再次检查连接。。。但是当我在连接断开时取消订阅时,我就不能再订阅了。 我做错了什么 constructor( private alertController: AlertController ){ let connection = this.checkConnection().subscribe(data => {

我正在检查互联网连接。每当连接丢失时,我想向用户显示一个警报,如果用户单击刷新按钮,我想再次检查连接。。。但是当我在连接断开时取消订阅时,我就不能再订阅了。 我做错了什么

  constructor( private alertController: AlertController ){

                    let connection = this.checkConnection().subscribe(data => {
                      let alert = this.alertController.create({
                          title: 'Error',
                          subTitle: "You lost connection !",
                          buttons: [ {
                     text: 'Refresh',
                     handler: () => {
                     connection.subscribe();
                }}]
               });

                  if(data == false){
                      alert.present();
                      connection.unsubscribe();
                  }
              }
                 );

        checkConnection() {

                   return Observable
                    .interval(500)
                    .map(() => {
                    return navigator.onLine;
                    });
                 }
更新:

     let refresh$ = new Subject();
          let connection$ = refresh$.mergeMap(() => {
                        return Observable
                                .interval(50)
                                .map(() => navigator.onLine)
                                .filter(onLine => !onLine) 
                                .take(1); 
                      });

                      refresh$.next();

            connection$.subscribe(data => {
                    console.log(data)

            })

我认为你误解了可观测的工作原理

当你取消订阅一个可观察对象时,作为可观察对象的消费者,你正在告诉可观察对象你不再想要向你发出更多的值。这是可观测到的摧毁其价值生产者的信号。所以,退订是一条单行道——没有回头路了

但你可能仍然可以实现你想要的。从您的代码中,似乎有一个
navigator.onLine
布尔值,您可以检查它以确定当前是否联机。如果该布尔值为false,则希望显示一条提示,告知用户他们已断开连接。此外,您似乎希望在该点停止检查连接,直到用户单击“刷新”,然后在该点上,您希望恢复检查

如果我让你的流程正确,那么你可以通过使用可观察链来实现

基本上,您需要组合多个观察对象以获得所需的效果

let refresh$ = new Subject();
let connection$ = refresh$.mergeMap(() => {
                    // on each refresh,
                    // create a new observable that checks every 50ms,
                    // but only emits if we are not online
                    return Observable
                            .interval(50)
                            .map(() => navigator.isOnline)
                            .filter(isOnline => !isOnline)  //only emit a when we go offline 
                            .take(1);  // just need a single value to notify us to bring up our alert prompt
                  });
因此,在上面的示例中,refresh$是一个主题,每当您想要开始检查脱机连接时,都可以调用next()。您将手动调用
refresh.next()
进行第一次检查,然后在每次按下刷新按钮后调用
refresh$.next()

连接$
是您订阅的可观察对象,每当它收到值时,您都会在其中显示警报框


我可能没有正确理解您的确切用例-我不得不根据您提交的代码进行猜测-但希望这能让您思考如何才能实现您想要的结果。

您在哪里再次订阅
?处理程序:()=>{connection.resubscribe();}}],但它不起作用。。你知道我怎样才能再次订阅吗?你能给我看一下重新订阅的api吗?你在哪里找到那个方法的?对不起,错了。这是使用这个主题的好地方。看一看,我更正了我的代码,想尝试一些东西。。但是仍然不能使它工作。。我错过了什么?当我订阅连接时,我应该查看控制台日志吗?在navigator.online切换为false之前,您不会看到控制台日志(仅当
!navigator.online
(即
navigator.online==false
)时,筛选器操作符才会发出
let refresh$ = new Subject();
let connection$ = refresh$.mergeMap(() => {
                    // on each refresh,
                    // create a new observable that checks every 50ms,
                    // but only emits if we are not online
                    return Observable
                            .interval(50)
                            .map(() => navigator.isOnline)
                            .filter(isOnline => !isOnline)  //only emit a when we go offline 
                            .take(1);  // just need a single value to notify us to bring up our alert prompt
                  });