[英]Rx.js and application workflow
我有一个Web应用程序,使用Rx.js处理事件流。 该应用程序使用后端提供的rest api
。
通常,我会订阅一个api
调用,完成请求后,我会渲染结果并重置其他控件状态(隐藏进度元素等)。
身份验证令牌过期后,某些api
调用可能会失败,并且我必须让用户再次登录(显示登录弹出窗口等)。
我很好奇是否有一种方法可以在成功登录后“恢复” api调用流? 用户不必提供其他操作即可获得服务器响应的地方。
当前工作流程的原始示例:
var apiCallStream = $.ajaxAsObservable(params):
apiCallStream.subscribe(
result => renderResult(result),
err => handleError(err));
function handleError(err) {
if (err.xhr.error === 401) {
LoginPopup();
} else {
ErrorPopup(err);
}
}
这里有一些(非常粗糙的伪代码),但是您可以使用retryWhen
来做到这retryWhen
:
// use Rx.DOM.get for an Observable Ajax GET
var source = Rx.DOM.get('/some/end/point')
.retryWhen(function(errors) {
// retryWhen: errors is a stream of errors
// whatever observable you return, when it emits, the
// observable you're operating on will be retried. (the entire thing)
return errors.filter(function(e) { return e.status === 401; })
// if status is 401, then tell the user to login
.flatMapLatest(function() { return doUserLogin; });
});
// a contrived observable that shows a form and
// return a stream of successful logins
var doUserLogin = Observable.create(function(observer) {
// show a form
var form = $('.my-form').show();
// when submit is fired on said form...
return Rx.Observable.fromEvent(form, 'submit')
// send a login over ajax
.flatMap(e => Rx.DOM.post('some/url/login', form.serialize()))
});
希望这可以给您一些开始。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.