gpt4 book ai didi

javascript - Rx.js 和应用程序工作流程

转载 作者:行者123 更新时间:2023-12-02 15:58:35 27 4
gpt4 key购买 nike

我有一个 Web 应用程序,我在其中使用 Rx.js 来处理事件流。该应用程序使用后端提供的rest api

大多数情况下,我都会订阅 api 调用,当请求完成时,我会渲染结果并重置其他控件状态(隐藏进度元素等)。

当身份验证 token 过期时,某些 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 来做到这一点:

// 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()))
});

希望这能为您提供一些开始。

关于javascript - Rx.js 和应用程序工作流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31392730/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com