首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何有条件地做retryWhen on action click from snackbar action Angular 7.x

在Angular 7.x中,如果要在Snackbar的操作按钮点击时有条件地执行retryWhen操作,可以按照以下步骤进行:

  1. 首先,确保已经安装了Angular Material库,以便使用Snackbar组件。可以通过运行以下命令来安装它:
代码语言:txt
复制
npm install @angular/material @angular/cdk
  1. 在需要使用Snackbar的组件中,导入Snackbar模块和相关的依赖:
代码语言:txt
复制
import { MatSnackBar, MatSnackBarRef, SimpleSnackBar } from '@angular/material';
import { Observable, of } from 'rxjs';
import { tap, delay, retryWhen, mergeMap } from 'rxjs/operators';
  1. 在组件的构造函数中注入MatSnackBar服务:
代码语言:txt
复制
constructor(private snackBar: MatSnackBar) { }
  1. 创建一个名为openSnackBar的方法,用于显示Snackbar,并在Snackbar的操作按钮点击时执行retryWhen操作:
代码语言:txt
复制
openSnackBar(): void {
  const snackBarRef: MatSnackBarRef<SimpleSnackBar> = this.snackBar.open('Snackbar Message', 'Retry', {
    duration: 3000, // Snackbar显示的持续时间
  });

  snackBarRef.onAction().subscribe(() => {
    this.retryAction().subscribe(); // 在操作按钮点击时执行retryWhen操作
  });
}
  1. 创建一个名为retryAction的方法,用于定义retryWhen操作的逻辑。在这个方法中,你可以根据需要自定义retryWhen的条件和重试策略。以下是一个示例:
代码语言:txt
复制
retryAction(): Observable<any> {
  let retryCount = 0;
  const maxRetryCount = 3;

  return of(null).pipe(
    delay(1000), // 延迟1秒后执行重试操作
    mergeMap(() => {
      retryCount++;
      if (retryCount <= maxRetryCount) {
        return this.yourApiCall(); // 替换为你的API调用
      } else {
        return throwError('Max retry count exceeded'); // 达到最大重试次数时抛出错误
      }
    }),
    retryWhen(errors => errors.pipe(
      tap(() => console.log('Retrying...')),
      delay(1000) // 延迟1秒后进行下一次重试
    ))
  );
}

yourApiCall(): Observable<any> {
  // 在这里执行你的API调用,并返回一个Observable对象
}

在上述代码中,retryAction方法使用of(null)创建一个Observable对象,然后使用delay操作符延迟1秒后执行重试操作。在mergeMap操作符中,你可以替换为你的实际API调用。如果达到最大重试次数,将使用throwError抛出错误。retryWhen操作符用于定义重试策略,它会在错误发生时进行重试,并在每次重试之间延迟1秒。

请注意,上述代码中的yourApiCall方法是一个示例,你需要根据实际情况替换为你的API调用。

这样,当Snackbar的操作按钮被点击时,将会执行retryWhen操作,并根据你定义的条件和重试策略进行重试。

希望这个答案能够满足你的需求。如果有任何疑问,请随时提问。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 在 redux 中集成 angular di 机制

    基本的使用项目文档介绍的已经很详细了,这里仅仅想分享在这段时间折腾redux和angular遇到的一个比较蛋疼的问题,以及是如何解决的。...那么我们如何来解决这个问题呢? 一种简单粗暴的方法就是,完全摒弃angular的di机制,使用外部的模块来解决问题。比如发请求,难道我们非要使用$http服务吗?...这个问题费了我不少时间去搜索网上的资料,类似如何action使用angular di机制,如果在action获取service实例等等,虽然能查到的资料都没有完美的给出解决方案,但是都把问题的解决方向...话虽然这么说,但是它是很有道理的,对于redux的中间件机制呢,它是对于action来设计的,即一个action,在最终转移到到处理它的reducer之前,会经过若干大大小小的中间件,这些中间件的事情十分的简单...import angular from 'angular' import R from 'ramda' export default function thunkWithDepsMiddleware

    82330

    一个Angular 5教程:一步一步指导实现你的第一个Angular 5应用程序

    以下是Angular如何知道如何找到与我们的标签相对应的组件。显然,templateUrl并且styleUrls定义Angular应该从哪里获取我们的标记和CSS。...如果您对我们为什么这么感到好奇,可以在Angular的文档中阅读它。...我们如何使用Angular的API?Angular给了我们HttpClient。...这就是你如何将效果集成到从服务器加载数据的过程。但是我们仍然需要将其发回到我们的卡片创建中。让我们来这件事吧。...更早运行构建,因此更容易修复。 国际化 构建我们的应用程序的另一个原因是Angular如何处理国际化,或者以简单的语言来讲,国际化。Angular不会在运行时处理它,而是在编译时进行处理。

    42.6K10

    Flutter 入门指北之弹窗和提示(干货)

    Flutter 中的操作提示主要有这么几种 SnackBar、BottomSheet、Dialog,因为 Dialog 样式比较多,放最后讲好了 SnackBar SnackBar 的源码相对简单 const...SnackBar({ Key key, @required this.content, // 提示信息 this.backgroundColor, // 背景色 this.action...Licenses 的网页,CLOSE 会关闭,至于为什么是英文的,是因为我们没有设置语言的原因,这个涉及到多语言,这边推荐几篇之前看过的文章,如果下次有时间的话会单独拿出来讲下 这边为了支持中文,我们下如下的修改...Dialog 状态保持 假如有个需求,需要在弹出的 Dialog 显示当前被改变的值,然后通过按钮可以修改这个值 ,该如何实现。...the `builder` does not share a context with the location that /// `showDialog` is originally called from

    2.2K20

    Flutter 构建完整应用手册-设计基础知识 顶

    这本食谱包含演示如何在写Flutter应用程序时解决常见问题的食谱。 每个配方都是独立的,可以作为参考帮助您构建应用程序。...显示SnackBars 在某些情况下,当发生某些操作时可以方便向用户简单通知。 例如,当用户在列表中删除消息时,我们可能想通知他们消息已被删除。 我们甚至可能想给他们一个撤消行为的选择!...为了达到这个目的,我们可以为SnackBar部件提供额外的action。 final snackBar = new SnackBar( content: new Text('Yay!...3.将字体设置为默认值 对于如何将字体应用于文本,我们有两种选择:作为默认字体或仅在特定的小部件中。 要使用字体作为默认字体,我们可以将fontFamily属性设置为应用theme的一部分。...child: new ListView( // Important: Remove any padding from the ListView.

    7.1K10

    一篇博客让你了解Material Design的使用

    无论是单一的控件还是图文布局,Google都给出了明确的设计说明,有兴趣的同学可以去上方提到的官方链接处进一步了解。 RecyclerView的使用 写条目布局: <?...itemView = View.inflate(parent.getContext(), R.layout.item_list, parent); View itemView = LayoutInflater.from...@Override public void onDrawerSlide(View drawerView, float slideOffset) { // 滑动的过程当中不断回调...//其中View是一个锚点 Snackbar snackbar = Snackbar.make(v, "是否打开XXX模式", Snackbar.LENGTH_SHORT); //只能设置一个Action...在TextInputLayout可以轻松通过getEditText方法找到它所包裹的EditText。、 在显示错误的时候,需要先设置错误的提示,每次显示的时候都要设置。

    3.3K30

    你不知道的Cypress系列(4) -- “PO”已死,App Action当立?

    可以明确的是,Cypress不提倡PageObject,并不是因为PageObject模型不好,而是因为由于Cypress运行原理的独特性,使用PageObject模型,一定程度上阻止了Cypress的更好...04 — App Action如何实现 我们来看下关键代码: // Magic! Cypress通过将应用程序窗口暴露出来,从而直接访问应用 // 程序本身的各种方法。实现我们一会讲。...从上图可以看到,这个应用程序是Vue的(React和Angular原理类似),通过Vue DevTools我们可以看出来,是属性showLoginModule控制Login窗口的出现。...具体怎么呢? 在入口文件main.js里, 在初始化vue实例后,把我们的app实例暴露给window context就好。 const app = new Vue({ // ... })....这就对了,这就是App Action流行不起来的原因: 1. 测试人员没有那么强的代码能力,去根据开发的代码写Cypress代码。 2. 开发人员未必愿意配合你这些。

    1.1K10
    领券