2016-09-07 3 views
1

안녕하세요. 이와 비슷한 것을 만들고 싶습니다.angular 2, if 문에 따라 Observables를 반환하십시오.

someFunction():Observable<Response>{ 
    let response$ = new Observerable(); 

    if (...){ 
    response$ = this.http.get(url1) 
    }else{ 
    response$ = this.http.get(url2) 
    } 
    return response$ 
} 

내가 가입하면 , 내가

재산을 읽을 사전에있는 모든 도움을

정의되지 않은 감사의 '구독'할 수 없습니다

오류를 받고 있어요!

EDIT --------- 이것은 이온 2와 코드 바를 사용하는 실제 기능입니다. 앱이 휴대 기기에 있는지 여부를 확인하고 URL이 팝업으로 열립니다 (소셜 로그인에 사용 예정)

일단 창이 닫히면 http.get 요청을 수행하여 토큰을 가져와야합니다 내 백엔드에서.

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

let response$ = new Observable<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(()=>{ 
      response$ = this.http.get(...) 
     },500) 
    }) 

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

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

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

      } 
     }) 
} 

return response$ 

}

+0

제공 한 코드 외부에서 문제가있는 것 같습니다. –

+0

그래서이 구문 정규식이 작동한다고 말하고 있습니까? –

+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(...) 

     } 
    }) 

에 할당 것도 아직 실행되지 않았다.

첫 번째는 0.5 초 후에 실행되고 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() 
} 

최소한의 문제는 해결되어야합니다.

+0

포인터에 대한 감사, 지금은 문제를 이해합니다. 그러나 귀하의 제안에 응답 $는 제목 권리 일 필요가 있습니까? 그렇지 않으면 .next를 사용할 수 없습니까? –

+0

당신 말이 맞아요. . –

+0

안녕하세요, 저는이 코드를 구독 할 때 이상한 행동을 취하지 만 코 도바 컨텍스트에서만 나타납니다. 콜백에있는 일부 코드는 매 2 회만 실행됩니다. 질문을 게시했습니다. 제발 좀 봐 주시겠습니까? http : //stackoverflow.com/questions/39385268/ionic-2-cordova-inappbrowser-subscribing-to-observableresponse-messing-up-ev –