如何循环史诗般的电话
How to loop epic call
我有以下史诗:
import {
map,
catchError,
switchMap,
takeUntil,
} from 'rxjs/operators';
import {
FETCH_JOKES,
jokesReceived,
FETCH_JOKES_CANCELLED,
jokesFetchFailed,
} from '../actions/jokes-action';
import { ofType } from 'redux-observable';
import { of, concat } from 'rxjs';
import { ajax } from 'rxjs/ajax';
const getJokes = () =>
ajax.getJSON('http://api.icndb.com/jokes/random?escape=javascript');
const fetchJokesEpic = action$ => {
return action$.pipe(
ofType(FETCH_JOKES),
switchMap(() =>
getJokes().pipe(
map(response => jokesReceived(response)),
catchError((err, act) => of(jokesFetchFailed(err))),
takeUntil(action$.pipe(ofType(FETCH_JOKES_CANCELLED)))
)
),
);
};
export default fetchJokesEpic;
每当调度 FETCH_JOKES
时,此史诗开始 ajax
调用并在成功时调度 jokesReceived
操作或在失败时调度 jokesFetchFailed
.
我想循环它,除非取消,否则端点将在上一次调用完成(成功或失败)后再次调用。
我想我可以使用另一个史诗 taht 会对 JOKES_RECEIVED
和 FETCH_JOKES_ERROR
动作做出反应,然后调度应该再次开始 cricle 的 FETCH_JOKES
动作。
import { ofType } from 'redux-observable';
import {
delay,
map,
} from 'rxjs/operators';
import {
JOKES_RECEIVED,
FETCH_JOKES_CANCELLED,
FETCH_JOKES_ERROR,
fetchJokes,
} from '../actions/jokes-action';
const pollJokes = (action$, state$) => {
return action$.pipe(
ofType(JOKES_RECEIVED, FETCH_JOKES_ERROR, FETCH_JOKES_CANCELLED),
delay(2000),
map(action => {
console.log('pollJokes.map', action);
if(action.type === FETCH_JOKES_CANCELLED)
{
console.log("Cancelled")
return { type: 'POLL_STOPPED' };
}
else {
// loop
return fetchJokes();
}
})
);
};
export default pollJokes;
然而,当我调度 FETCH_JOKES_CANCELLED
操作时,这不起作用。操作堆栈如下所示:
@INIT
FETCH_JOKES
JOKES_RECEIVED
FETCH_JOKES
JOKES_RECEIVED
...
FETCH_JOKES_CANCELLED
FETCH_JOKES
JOKES_RECEIVED
POLL_STOPPED
FETCH_JOKES
JOKES_RECEIVED
...
我尝试将 takeUntil
添加到 pollJokes
史诗中,但结果同样糟糕
const pollJokes = (action$, state$) => {
return action$.pipe(
ofType(JOKES_RECEIVED, FETCH_JOKES_ERROR, FETCH_JOKES_CANCELLED),
delay(2000),
map(action => {
console.log('pollJokes.map', action);
if(action.type === FETCH_JOKES_CANCELLED)
{
console.log("Cancelled")
return { type: 'POLL_STOPPED' };
}
else {
// loop
return fetchJokes();
}
}),
takeUntil(action$.pipe(ofType(FETCH_JOKES_CANCELLED)))
);
};
使用此方法,pollJokes
史诗会在 FETCH_JOKES_CANCELLED
首次调度后立即停止工作。现在我知道史诗是在 takeUntil
.
完成的
我该怎么做才能让这个 "looping" 工作?我猜想实现一个在 JOKES_RECEIVED
调度时实际调用 fetchJokes
的中间件,但我正在搜索 all-rxjs-solution、
您需要使用 repeat
才能重新启动您的史诗,一旦它被 takeUntil
取消
const pollJokes = (action$, state$) => {
return action$.pipe(
ofType(JOKES_RECEIVED, FETCH_JOKES_ERROR, FETCH_JOKES_CANCELLED),
delay(2000),
map(action => {
console.log('pollJokes.map', action);
if(action.type === FETCH_JOKES_CANCELLED)
{
console.log("Cancelled")
return { type: 'POLL_STOPPED' };
}
else {
// loop
return fetchJokes();
}
}),
takeUntil(action$.pipe(ofType(FETCH_JOKES_CANCELLED))),
repeat()
);
};
我有以下史诗:
import {
map,
catchError,
switchMap,
takeUntil,
} from 'rxjs/operators';
import {
FETCH_JOKES,
jokesReceived,
FETCH_JOKES_CANCELLED,
jokesFetchFailed,
} from '../actions/jokes-action';
import { ofType } from 'redux-observable';
import { of, concat } from 'rxjs';
import { ajax } from 'rxjs/ajax';
const getJokes = () =>
ajax.getJSON('http://api.icndb.com/jokes/random?escape=javascript');
const fetchJokesEpic = action$ => {
return action$.pipe(
ofType(FETCH_JOKES),
switchMap(() =>
getJokes().pipe(
map(response => jokesReceived(response)),
catchError((err, act) => of(jokesFetchFailed(err))),
takeUntil(action$.pipe(ofType(FETCH_JOKES_CANCELLED)))
)
),
);
};
export default fetchJokesEpic;
每当调度 FETCH_JOKES
时,此史诗开始 ajax
调用并在成功时调度 jokesReceived
操作或在失败时调度 jokesFetchFailed
.
我想循环它,除非取消,否则端点将在上一次调用完成(成功或失败)后再次调用。
我想我可以使用另一个史诗 taht 会对 JOKES_RECEIVED
和 FETCH_JOKES_ERROR
动作做出反应,然后调度应该再次开始 cricle 的 FETCH_JOKES
动作。
import { ofType } from 'redux-observable';
import {
delay,
map,
} from 'rxjs/operators';
import {
JOKES_RECEIVED,
FETCH_JOKES_CANCELLED,
FETCH_JOKES_ERROR,
fetchJokes,
} from '../actions/jokes-action';
const pollJokes = (action$, state$) => {
return action$.pipe(
ofType(JOKES_RECEIVED, FETCH_JOKES_ERROR, FETCH_JOKES_CANCELLED),
delay(2000),
map(action => {
console.log('pollJokes.map', action);
if(action.type === FETCH_JOKES_CANCELLED)
{
console.log("Cancelled")
return { type: 'POLL_STOPPED' };
}
else {
// loop
return fetchJokes();
}
})
);
};
export default pollJokes;
然而,当我调度 FETCH_JOKES_CANCELLED
操作时,这不起作用。操作堆栈如下所示:
@INIT
FETCH_JOKES
JOKES_RECEIVED
FETCH_JOKES
JOKES_RECEIVED
...
FETCH_JOKES_CANCELLED
FETCH_JOKES
JOKES_RECEIVED
POLL_STOPPED
FETCH_JOKES
JOKES_RECEIVED
...
我尝试将 takeUntil
添加到 pollJokes
史诗中,但结果同样糟糕
const pollJokes = (action$, state$) => {
return action$.pipe(
ofType(JOKES_RECEIVED, FETCH_JOKES_ERROR, FETCH_JOKES_CANCELLED),
delay(2000),
map(action => {
console.log('pollJokes.map', action);
if(action.type === FETCH_JOKES_CANCELLED)
{
console.log("Cancelled")
return { type: 'POLL_STOPPED' };
}
else {
// loop
return fetchJokes();
}
}),
takeUntil(action$.pipe(ofType(FETCH_JOKES_CANCELLED)))
);
};
使用此方法,pollJokes
史诗会在 FETCH_JOKES_CANCELLED
首次调度后立即停止工作。现在我知道史诗是在 takeUntil
.
我该怎么做才能让这个 "looping" 工作?我猜想实现一个在 JOKES_RECEIVED
调度时实际调用 fetchJokes
的中间件,但我正在搜索 all-rxjs-solution、
您需要使用 repeat
才能重新启动您的史诗,一旦它被 takeUntil
const pollJokes = (action$, state$) => {
return action$.pipe(
ofType(JOKES_RECEIVED, FETCH_JOKES_ERROR, FETCH_JOKES_CANCELLED),
delay(2000),
map(action => {
console.log('pollJokes.map', action);
if(action.type === FETCH_JOKES_CANCELLED)
{
console.log("Cancelled")
return { type: 'POLL_STOPPED' };
}
else {
// loop
return fetchJokes();
}
}),
takeUntil(action$.pipe(ofType(FETCH_JOKES_CANCELLED))),
repeat()
);
};