gpt4 book ai didi

Angular 2 从 RxJs 订阅返回数据

转载 作者:太空狗 更新时间:2023-10-29 16:58:40 25 4
gpt4 key购买 nike

我有一个具有身份验证功能的服务 -

authenticate(username: string, password: string) {
let ret;
let packet = JSON.stringify({
username: username,
password: password
});

let headers = new Headers();
headers.append('Content-Type', 'application/json');

this.http.post('http://localhost:5000/api/authenticate/', packet, {
headers: headers
})
.map(res => res.json())
.subscribe(
data => {
// put return data into ret
ret = data.token;
},
err => console.log(err),
() => {
// this works!
console.log(ret);
}
);

// get's returned before I put data into it
return ret;
}

因此,如果我调用身份验证函数 console.log(authenticate('a', 'b'));,它会记录 undefined,因为 ret 变量在订阅函数可以将数据放入其中之前返回。如何从 authenticate 函数返回 http 响应数据?我以前从未用 RxJS 做过任何反应式编程,而这正是 angular 2 似乎正在使用的。

附言。有没有像 go channels 或 core.async 这样的 javascript 的合适的 CSP 解决方案?

最佳答案

我使用 Observables 和 Observers 来构建我的解决方案。由于 @Injectable 创建了一个单例类,我在其中声明了一个 Observable,然后将其暴露给我的组件。当我将任何数据放入其中时,所有订阅者都会收到事件通知。警告:如果你将它与 zone.js 0.5 一起使用,它将无法工作。适用于 0.6。

import {Observable} from 'rxjs/Observable';
import {Observer} from 'rxjs/Observer';
import 'rxjs/add/operator/share';
import 'rxjs/add/operator/map';
import 'rxjs/Rx';


@Injectable()
export class AuthService {
// expose to component
notification$: Observable<Notification>;
private observer: Observer<Notification>;

....

constructor(private http: Http) {
this.notification$ = new Observable(observer => this.observer = observer).share();
}

authenticate({username, password}) {
let packet = JSON.stringify({
username: username,
password: password
});

let headers = new Headers();
headers.append('Content-Type', 'application/json');

this.http.post(`${this.baseUri}/authenticate/`, packet, {
headers: headers
})
.map(res => res.json())
.subscribe(
data => {
if (data.success && data.token) {
this.saveJwt(data.token);
} else {
this.deleteJwt();
}
// put data into observavle
this.observer.next({
message: data.message,
type: data.success
});
},
err => {
// put data into observavle
this.observer.next({
message: 'Error connecting to server',
type: false
})
},
() => {}
);
}
}


export class AuthComponent implements OnInit {
observable: Observable<Notification>;

...

ngOnInit() {
// subscribe to the observable
this.observable = this.authService.notification$;
this.observable.subscribe(
data => {
...
}
)
}
}

关于Angular 2 从 RxJs 订阅返回数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36342784/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com