以下代码有效。它执行ajax请求,然后一次调用2个操作:
export const loadThingsEpic = action$ => {
return action$.ofType(LOAD_THINGS)
.mergeMap(({things}) => {
const requestURL = `${AppConfig.serverUrl()}/data/things`;
return ajax.getJSON(requestURL)).map(response => {
return finishLoadingThings(response);
}).map(() => {
return sendNotification('success');
});
})
.catch(e => {
return concat(of(finishLoadingThings({ things: {} })),
of(sendNotification('error')));
});
}}
但是这段代码没有:
export const loadThingsEpic = action$ => {
return action$.ofType(LOAD_THINGS)
.mergeMap(({things}) => {
const requestURL = `${AppConfig.serverUrl()}/data/things`;
return ajax.getJSON(requestURL).switchMap(response => {
return concat(of(finishLoadingThings(response)),
of(sendNotification('success')));
});
})
.catch(e => {
return concat(of(finishLoadingThings({ things: {} })),
of(sendNotification('error')));
});
}
我用switchMap替换地图,将两个动作合并在一起(如许多其他帖子所示)。如果抛出异常,它在catch中工作。我想知道代码是什么问题。我猜它是因为我似乎无法真正掌握何时使用:map,swicthMap和mergeMap。
sendNotification和finishLoadingthings返回操作对象:
export function finishLoadingThings(data: any) {
return {
type: FINISH_LOADING_THINGS,
data,
};
}
谢谢!
答案 0 :(得分:1)
按原样提供的代码似乎按预期工作:https://jsbin.com/becapin/edit?js,console我没有收到"无效的对象,其中有预期的流" ajax成功或失败时出错。
您确定错误来自此代码吗?
另外,您可能会高兴地听到forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'my-placeholder'}))
支持任意数量的参数,每个参数将在另一个参数之后发出。所以不要这样:
Observable.of
你可以这样做:
.switchMap(response => {
return concat(of(finishLoadingThings(response)),
of(sendNotification('success')));
});
这不会导致错误,但它只是更清洁。
答案 1 :(得分:0)
我设法通过在与mergeMap相同的级别上执行switchMap来解决我的问题。像这样:
export const loadThingsEpic = action$ => {
return action$.ofType(LOAD_THINGS)
.mergeMap(({things}) => {
const requestURL = `${AppConfig.serverUrl()}/data/things`;
return ajax.getJSON(requestURL).switchMap(response => {
return of(response);
});
})
.switchMap((res) => {
return concat(of(finishLoadingThings(res.value)),
of(sendNotification('success')));
})
.catch(e => {
return concat(of(finishLoadingThings({ things: {} })),
of(sendNotification('error')));
});
}
还没有完全明白。