条件认证场景中httpGet回调未触发,如何让流程等待请求完成?
问题
我配置了一个用户名密码登录的认证场景,想在executeStep.onSuccess里调用httpGet请求检查用户权限,但httpGet的onSuccess或onFail回调从未触发,认证流程却正常继续。
脚本如下:
executeStep(1, { onSuccess: function(context) { var user = context.currentKnownSubject; Log.info("before request"); httpGet('https://my.custom.service/check?' + user.username, { onSuccess: function(context, data) { Log.info("can go"); executeStep(2); }, onFail: function(context, data) { Log.info("failed"); } }) Log.info("after request"); } })
能看到before request和after request日志,但看不到can go或failed日志。我以为流程会等待httpGet请求完成,但实际不是。怎么让脚本等待服务调用完成再做处理?
解决方案
问题核心是httpGet是异步执行的:你的onSuccess函数会直接执行到Log.info("after request")就结束,认证流程不会等待异步请求完成,甚至可能脚本上下文被提前销毁,导致回调函数根本没机会触发。
有两种可行的解决方式:
1. 使用同步HTTP请求(推荐)
如果你的认证环境支持同步HTTP请求方法(比如httpGetSync),直接替换成同步调用,代码会阻塞等待请求完成后再处理结果:
executeStep(1, { onSuccess: function(context) { var user = context.currentKnownSubject; Log.info("before request"); try { var response = httpGetSync('https://my.custom.service/check?' + user.username); Log.info("can go"); executeStep(2); } catch (error) { Log.info("failed"); // 可添加权限校验失败后的处理逻辑,比如终止认证流程 } Log.info("after request"); } })
2. 控制异步流程的执行时机
如果必须使用异步httpGet,需要确保认证流程不会在请求完成前继续,同时保证回调能正常执行。可以通过阻止默认流程,在回调里手动触发下一步:
executeStep(1, { onSuccess: function(context) { var user = context.currentKnownSubject; Log.info("before request"); httpGet('https://my.custom.service/check?' + user.username, { onSuccess: function(ctx, data) { Log.info("can go"); executeStep(2); }, onFail: function(ctx, data) { Log.info("failed"); // 权限校验失败时,终止认证流程或跳转到错误步骤 context.cancel(); } }); // 返回Promise让脚本等待异步操作完成(需环境支持) return new Promise((resolve) => { // 在onSuccess和onFail回调中调用resolve,结束等待 // 示例:在onSuccess里添加resolve(),onFail里也添加resolve() }); } })
注意:第二种方法需要你的认证脚本环境支持返回Promise来等待异步操作,不同系统可能有不同要求,需结合实际环境调整。
内容的提问来源于stack exchange,提问作者Erdogan Kurtur
相关产品推荐
相关产品推荐

