写点什么

为什么我的 C4C Service Request 没办法 Release 到 ERP?

作者:Jerry Wang
  • 2021 年 11 月 28 日
  • 本文字数:851 字

    阅读完需:约 3 分钟

为什么我的 C4C Service Request 没办法 Release 到 ERP?

问题

UI 上发现找不到 Release to ERP 的按钮:



但是在 UI Designer 里是能看到这个按钮的。检查其 Visible 的属性,绑到了一个 Calculated Rule 上面:



发现其显示在 runtime UI 的条件为:Service Interface 1425 必须为激活状态, 且 FullCreateModeInactive 必须为 true。



检查这两个节点 runtime 的值,发现看不见 button 的原因为 1425 这个 service interface 在该系统上没有激活。




Angular

我们在 Angular 框架的代码里能看到一个名为 processQueue 的函数:



这个函数是通过apply 启动的:



核心代码位于一个 for 循环里,循环体是一个存储异步处理任务的队列 asyncQueuePosition:


for (var asyncQueuePosition = 0; asyncQueuePosition < asyncQueue.length; asyncQueuePosition++) {
try {
asyncTask = asyncQueue[asyncQueuePosition];
fn = asyncTask.fn;
fn(asyncTask.scope, asyncTask.locals);
} catch (e) {
$exceptionHandler(e);
}
lastDirtyWatch = null;
}
复制代码


队列里每个元素长这样的:一个处理函数 fn,一个局部变量 locals 和 scope 对象:



这个注释也非常有用:一旦 Angular 发现由apply 触发的 JavaScript 执行序列里又出现了apply 的嵌套调用,会抛出错误消息:$digest already in progress


// It's safe for asyncQueuePosition to be a local variable here because this loop can't


// be reentered recursively. Calling evalAsync would


// lead to a '$digest already in progress' error.

C4C 事件队列

C4C 的事件处理器,EventProcessor.js 有一个事件队列:



该队列的实现位于 sap/client/evt/的 OperationQueue.js 中:



随便在 C4C UI 做一个点击,能触发 EventProcessor 的_processQueue,C4C 事件队列的处理和 Angular 思路一样,只不过是一个 while 循环替代了 Angular 的 for 循环:



C4C 事件队列里每个元素属性如下,可以同 Angular 事件元素做对比:


fFunc 就相当于 Angular 时间元素的 fn 属性,environment 相当于 Angular 事件元素的 scope 属性。





要获取更多 Jerry 的原创文章,请关注公众号"汪子熙".


发布于: 4 小时前阅读数: 5
用户头像

Jerry Wang

关注

个人微信公众号:汪子熙 2017.12.03 加入

SAP成都研究院开发专家,SAP社区导师,SAP中国技术大使。

评论

发布
暂无评论
为什么我的 C4C Service Request 没办法 Release 到 ERP?