草庐IT

Angular,NGRX/Store,以单个序列为单一的select和async调用

程序员大本营 2024-05-31 原文

有人知道是否有机会从商店获得价值,然后致电Angular HTTP服务?请参见下面的示例。提前致谢。

我有一个使用异步方法的服务。在此方法中,我调用Angular HTTP服务,但是在调用Angular HTTP服务之前,我想从商店(Oauth访问令牌)检索一些值。问题是我将Oauth令牌存储在商店中,我必须将令牌添加到请求中。如果服务器响应401错误,则我刷新令牌并重复请求或新令牌请求。

@Injectable()export class Interceptor {   public get(request: Request): Observable<any> {      return this.store.select((s) => s.session.accessToken)         // tried .switchMap, it wasn't working for multiple requests         // .flatMap also is not working         // commented below is working but I don't think that it is right solution         // return Observable.of(request)         // .withLatestFrom(this.store.select((s) => {         //    return s.session.accessToken         // }))         // .flatMap(([config, accessToken]) => { ... })         .flatMap((accessToken) => {            request.headers.set("Authorization", `Bearer ${accessToken}`);            return this.http.request(request);         })         .map((response) => {            return response.json();         })         .catch((response) => {            return this.handleError(response, request);         });   }   // handle errors   private handleError(response: Response, request: Request): Observable<Response> {       // handle outdated api tokens       if (response.status === HttpStatusesEnum.Unauthorized) {           const deferredRequest = new DeferredRequestModel({ request });           // appends HTTP request configuration object with deferred response           // attached to buffer           this.buffer(deferredRequest );           return deferredRequest.observable;       }       // handle server error       if (response.status === HttpStatusesEnum.InternalServerError) {           ...       }       ...       return Observable.throw(response);   }}export class DeferredRequestModel {    public observable: AsyncSubject<Response>;    public request: Request;    constructor(obj?: Partial<DeferredRequestModel>) {        this.observable = new AsyncSubject<Response>();        this.request = obj && obj.request || null;    }    public reject(error?: any): void {        this.end({ isValue: false, value: error });    }    public resolve(value?: any): void {        this.end({ isValue: true, value });    }    private end(result: any): void {        if (this.observable.isStopped) {            console.warn("Deferred already resloved/rejected.");            return;        }        if (result.isValue) {            this.observable.next(result.value);            this.observable.complete();        } else {            this.observable.error(result.error);        }    }}

然后,当我致电某些服务时,它将通过Interceptor发送请求。

export class SomeEffect {   constructor(private someService: SomeService) {}   @Effect()   public someMethod(): Observable<Action> {      return this.actions$.ofType(SOME_ACTION_GET)         .map((action: SomeActions.Get) => action.payload)         .switchMap((someObj) => {            // someMethod call interceptor inside someService, it won't call angular             // http service directly            return this.someService.someMethod(someObj);         })         .map((someResult) => {            return new SomeActions.GetSuccess(someResult);         });   }}

我尝试在拦截器中使用switchmap,但是如果拦截器被称为多次一次,则它将无法使用。

看答案

我会做这样的事情:

return this.store.select(reducers.getAccessToken)  .take(1)  .switchMap(token => {    const headers = new Headers();    headers.append('Authorization', `Bearer ${token}`);    return this.http.get('...', { headers });  });

getAccessToken 方法是在全局还原文件中使用的方法 reselect 这边走:

export const getAccessToken = createSelector(  getAuthState, authReducer.getToken);

有关Angular,NGRX/Store,以单个序列为单一的select和async调用的更多相关文章

  1. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  2. ruby-on-rails - rspec should have_select ('cars' , :options => ['volvo' , 'saab' ] 不工作 - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request

  3. ruby-on-rails - 事件记录 : Select max of limit - 2

    我正在尝试将以下SQL查询转换为ActiveRecord,它正在融化我的大脑。deletefromtablewhereid有什么想法吗?我想做的是限制表中的行数。所以,我想删除少于最近10个条目的所有内容。编辑:通过结合以下几个答案找到了解决方案。Temperature.where('id这给我留下了最新的10个条目。 最佳答案 从您的SQL来看,您似乎想要从表中删除前10条记录。我相信到目前为止的大多数答案都会如此。这里有两个额外的选择:基于MurifoX的版本:Table.where(:id=>Table.order(:id).

  4. ruby-on-rails - rails 上的 ruby : radio buttons for collection select - 2

    我有一个集合选择:此方法的单选按钮是什么?谢谢 最佳答案 Rails3中没有这样的助手。在Rails4中,它是collection_radio_buttons. 关于ruby-on-rails-rails上的ruby:radiobuttonsforcollectionselect,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/18525986/

  5. ruby-on-rails - 将保存回调添加到单个 ActiveRecord 实例,可以吗? - 2

    是否可以为单个ActiveRecord实例添加回调?作为进一步的限制,这是继续使用库,所以我无法控制该类(除了对其进行猴子修补)。这或多或少是我想做的:defdo_something_creazymessage=Message.newmessage.on_save_call:do_even_more_crazy_stuffenddefdo_even_more_crazy_stuff(message)puts"Message#{message}hasbeensaved!Hallelujah!"end 最佳答案 你可以通过在创建对象后立

  6. ruby - 我可以使用 RVM 为所有用户维护单一版本的 Ruby 吗? - 2

    我喜欢RVM。我意识到它的主要用例是让不同的用户在不同版本的Ruby之间切换。但是假设我正在将Rails应用程序部署到服务器,并且我只想运行单个版本的Ruby。特别是,我想要1.9.2,用RVM安装它很容易,但没有它就很痛苦。有没有一种方法可以让我说“我希望这是所有用户的规范Ruby安装”(连同它的所有gem),而不必手动创建一堆符号链接(symboliclink)并在每次更新到更新时更改它们Ruby版本? 最佳答案 以root身份安装RVM并执行sudorvmuse1.9.2--default。任何采购/usr/local/rvm

  7. ruby - Rails 3 - 我可以将开始日期设置为 date_select 方法吗? - 2

    date_select方法只能设置:start_year,但我想设置开始日期(例如3个月前的日期)(但没有这样的选项)。那么,我可以将开始日期设置为date_select方法吗?或者,要制作这样的选择框,我应该使用select_tag和options_for_select吗?或者,有什么解决办法吗?谢谢, 最佳答案 有可能……例如:start_year–设置年份选择的开始年份。默认为Time.now.year-5参见thisresource. 关于ruby-Rails3-我可以将开始日期

  8. ruby-on-rails - date_select ruby - 2

    如何在Ruby中扩展date_select的范围??它只显示2005年,我想用它作为出生日期。 最佳答案 您可以使用:start_year选项,参见thedocumentation. 关于ruby-on-rails-date_selectruby,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/2047739/

  9. python - 为什么某些正则表达式引擎会在单个输入字符串中匹配 .* 两次? - 2

    许多正则表达式引擎在单行字符串中匹配.*两次,例如,在执行基于正则表达式的字符串替换时:根据定义,第一个匹配项是整个(单行)字符串,正如预期的那样。在许多引擎中有第二个匹配项,即空字符串;也就是说,即使第一个匹配项消耗了整个输入字符串,.*仍会再次匹配,然后匹配输入字符串末尾的空字符串。注意:要确保只找到一个匹配项,请使用^.*我的问题是:这种行为有充分的理由吗?一旦输入字符串被完全使用,我不希望再次尝试找到匹配项。除了反复试验之外,您能否从支持的文档/正则表达式方言/标准中收集到哪些引擎表现出这种行为?更新:revo'shelpfulanswer解释当前行为的方式;至于潜在的原因,请

  10. ruby-on-rails - Rails 4 Has_many :through join association with select - 2

    我正在尝试将Rails3.0应用程序升级到Rails4.0。我注意到的行为之一是模型之间的关系停止工作。假设我们有以下模型:classStudent:teacher_students,:select=>'teacher_students.met_with_parent,teachers.*'#TheRails4syntaxhas_many:teachers,->{select('teacher_students.met_with_parent,teachers.*')},:through=>:teacher_studentsendclassTeacher:teacher_student

随机推荐