角度2,根据if语句返回Observables

时间:2016-09-07 12:55:25

标签: angular rxjs observable subscribe

嗨,我想创造这样的东西。

colspan

如果我订阅它,我会收到错误

  

无法阅读财产'订阅'未定义的

提前感谢您的所有帮助!

EDIT --------- 这是使用离子2和cordova的实际功能。 它检查应用程序是否在移动设备上,并打开带有url的弹出窗口(打算用于社交登录)

关闭窗口后,我需要执行http.get请求以从后端获取令牌。

countAllChildren($node)

}

1 个答案:

答案 0 :(得分:1)

更新揭示了问题 您不是直接分配给response$,而是分配给异步回调。执行return response$时,response$

的任何分配都没有
    setTimeout(()=>{
         response$ = this.http.get(...)
    },500)

也不是

let  pingWindow = window.subscribe(
    ()=>{
        if(authWindow.closed){
            pingWindow.unsubscribe();

            response$ = this.http.get(...)

        }
    })

已被执行。

第1次执行0.5s后执行,第2次执行传递给window.subscribe(...)的函数时,由于发射值稍后将在某些点。

public social(providerName:string):Observable<Response>{

    let response$ = new Subject<Response>();
    let url =providerName+'/someUrl'

    let authWindow;

    if(window.cordova){
        let authWindow= InAppBrowser.open(url, '_blank', 'location=no');

        authWindow.addEventListener('loadstop', event => {
            if(event.url.indexOf(`${providerName}/callback`) > -1){
                authWindow.close()
            }
        });

        authWindow.addEventListener('loaderror', event =>{
            if(event.url.indexOf(`${providerName}/callback`) > -1){
                authWindow.close()
            }
        });

        authWindow.addEventListener('exit', () => {
            setTimeout(()=>{
                 this.http.get(...)
                 .map(val => val.json())
                 .subscribe(val => response$.next(val);
            },500)
        })

    }else{
        authWindow = createWindow(popupUrl);
        let window = Observable.interval(1000);

        let  pingWindow = window.subscribe(
            ()=>{
                if(authWindow.closed){
                    pingWindow.unsubscribe();

                    this.http.get(...)
                    .map(val => val.json())
                    .subscribe(val => response$.next(val);
                }
            })
    }

    return response$.asObservable()
}

这应该至少解决你的直接问题。