gpt4 book ai didi

angular - ionic 存储 "get"仅在方法内的第二次调用时返回 null

转载 作者:行者123 更新时间:2023-12-05 05:19:42 25 4
gpt4 key购买 nike

我在使用 Ionic Storage 时遇到了一个非常奇怪的问题。我有一个方法可以从存储中读取一个值并返回一个包含与该值对应的对象的 promise :

private getAuthorizedOptions(): Promise<RequestOptions>
{
return this._storage.get('bdAccessToken')
.then(v => {
console.log("access token: ", v);
let token = v;
let header = new Headers({
'Authorization': 'Bearer ' + token
});
let ro = new RequestOptions({
headers: header
});
let options = new RequestOptions();
if (options.headers) options.headers.delete("Authorization");
options.headers = header;
return options;
});
}

现在我有另一种方法,它将在一系列操作中调用上述方法两次:

get(url:string, options?:RequestOptions): Observable<Response>
{
return Observable.fromPromise(this.getAuthorizedOptions())
.mergeMap((options) =>
{
return super.get(url, options)
.catch(err => {
if (err && err.status === 401)
{
return this._authService.refreshToken()
.mergeMap(r =>
{
return Observable.fromPromise(this.getAuthorizedOptions())
.mergeMap(opt => {
return super.get(url, opt)
});

}
)
.catch(err2 => {
console.log("redirecting.");
this.redirect();
return Observable.throw(err2);
});
}
else {
return Observable.throw(err);
}
});
});
}

现在跟踪这些方法会发现一些奇怪的东西。第一次调用“getAuthorizedOptions()”方法时,它可以很好地从存储中读取“bdAccessToken”值。第二次调用,返回值为NULL。

我已经为此苦苦思索了两天,非常感谢您的帮助,就像您以前从未受到过感谢一样!哈哈!

最佳答案

我在存储和古怪行为方面遇到了一些问题,最终与异步问题有关。

事情没有按照期望/预期的顺序执行。

所以我最终让我的服务有状态并监控 BehaviourSubject 事件。

import { Injectable }       from '@angular/core';
import { Storage } from '@ionic/storage';
import { Server } from './../model/server';
import { Subscription } from 'rxjs/Subscription';
import { BehaviorSubject } from "rxjs/BehaviorSubject";

export class LoginService {
private static readonly SERVER = 'server';
private servers$:BehaviorSubject<Server[]>;
private servers: Server[];
public serversSubs:Subscription

constructor(public storage: Storage) {

this.servers$ = new BehaviorSubject([] as Server[]);
this.nextServersFromGetLocal(); // May need to be after subscribe.. Hot off presses..
this.serversSubs = this.servers$.subscribe((servers:Server[]) =>
this.servers = servers);
}


private nextServersFromGetLocal():void {
this.storage.get(LoginService.SERVER).
then( (value:string) => {
this.servers$.next( JSON.parse(value) as Server[] );
}
).catch( () => {
this.servers$.next( [] as Server[] );
}
);
}

private nextServersFromSetLocal(servers:Server[]): void {
let data = JSON.stringify(servers);
this.storage.set(LoginService.SERVER, data);
this.servers$.next(servers);
}

getServers$(): BehaviorSubject<Server[]> {
return this.servers$;
}

addServer(addServer:Server): void {
// other code too...
this.servers.push(addServer);
this.nextServersFromSetLocal(this.servers);
}

changeServer(changeServer:Server): void {
// other code too...
this.nextServersFromSetLocal(this.servers);
}

deleteServer(deleteServer:Server): void {
// other code too..
this.nextServersFromSetLocal(this.servers);
}
}

这种重构的额外好处是简化了在服务上执行 CRUD 操作的其他代码,因为异步行为不必内联复杂的嵌套/重复 promise/then/catch 代码块。希望对您有所帮助。

当我发布了一个相关问题时,您可以大致了解它是如何在我的 Ionic 应用程序 here 的上下文中工作的,并且您可以在屏幕截图中看到它的 HTML View 方面

关于angular - ionic 存储 "get"仅在方法内的第二次调用时返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45655939/

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