嗨,我想创造这样的东西。
colspan
如果我订阅它,我会收到错误
无法阅读财产'订阅'未定义的
提前感谢您的所有帮助!
EDIT --------- 这是使用离子2和cordova的实际功能。 它检查应用程序是否在移动设备上,并打开带有url的弹出窗口(打算用于社交登录)
关闭窗口后,我需要执行http.get请求以从后端获取令牌。
countAllChildren($node)
}
答案 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()
}
这应该至少解决你的直接问题。