首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >angular和RxJS/switchMap

angular和RxJS/switchMap
EN

Stack Overflow用户
提问于 2019-05-27 17:38:21
回答 2查看 491关注 0票数 1

大家好,我是RxJS的新手,我刚刚开始了解运算符。我想在点击按钮后,在控制台中显示下一秒间隔内的6个数字。我想在下一次点击后使用switchMap重置计数器。

我一直在尝试使用switchMap,但是计数器没有重置。

代码语言:javascript
复制
obsSwitchMap: Observable<any>;

this.obsSwitchMap = of(null).pipe(
  switchMap(x => from([1, 2, 3]).pipe(
    concatMap(item => of(item).pipe(delay(300)))
    )
  )  
)

onSwitchMapBtnClick() {
  this.obsSwitchMap.subscribe(x => {
    console.log(x)
  })
}

数字相互独立地显示

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-27 17:44:22

虽然你想学习,但我认为你应该从一开始就学习最佳实践。

这意味着你可以在没有switchMap的情况下很简单地做到这一点:

代码语言:javascript
复制
const newInterval = () => rxjs.timer(0, 1000).pipe(
  rxjs.operators.map(nb => new Array(6).fill(nb).map((v, i) => v + i + 1))
);

let subscription;

function resetTimer() {
  subscription && subscription.unsubscribe();
  subscription = newInterval().subscribe(v => console.log(v));
}

resetTimer();
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.5.2/rxjs.umd.js"></script>

<button onclick="resetTimer()">Reset timer</button>

编辑

下面是一个switchMap示例:

代码语言:javascript
复制
const horsemen = [
  { id: 1, name: 'Death' },
  { id: 2, name: 'Famine' },
  { id: 3, name: 'War' },
  { id: 4, name: 'Conquest' },
];

// Fake HTTP call of 1 second
function getHorseman(id) {
  return rxjs
    .of(horsemen.find(h => h.id === id))
    .pipe(rxjs.operators.delay(1000));
}

const query = document.querySelector('input');
const result = document.querySelector('div.result');

// Listen to input
rxjs.fromEvent(query, 'input')
  .pipe(
    rxjs.operators.map(event => +event.target.value), // Get ID
    rxjs.operators.switchMap(id => getHorseman(id)) // Get Horseman
  ).subscribe(horseman => {
    let content;
    if (horseman) content = `Horseman = ${horseman.name}`;
    else content = `Horseman unknown`;
    result.innerText = content;
  });
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.5.2/rxjs.umd.js"></script>

<input type="text" placeholder="Input an ID here (1-4)">

<div class="result"></div>

票数 0
EN

Stack Overflow用户

发布于 2019-08-08 03:30:11

我已经找到了使用switchMap的简单解决方案。在每次点击时,重新启动您的可观察计数器并获取您想要的项目数量。

代码语言:javascript
复制
const btn = document.querySelector('button');

fromEvent(btn, 'click').pipe(
    switchMap((item => interval(1000).pipe(take(6)))),
).subscribe(console.log)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56323427

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档