Skip to content

Commit 6f2fb86

Browse files
authored
[elsa] 优化testRun逻辑,避免返回的nodes顺序与流的顺序不一致,发生刷新状态错序的问题 (#24)
1 parent 2a03bd9 commit 6f2fb86

File tree

1 file changed

+48
-9
lines changed

1 file changed

+48
-9
lines changed

framework/elsa/fit-elsa-react/src/flow/jadeFlowPage.js

Lines changed: 48 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -397,28 +397,67 @@ export const jadeFlowPage = (div, graph, name, id) => {
397397
self.removeEventListener('shape_rendered', listener);
398398
};
399399

400+
/**
401+
* 按照指定的有序节点列表对节点数组进行重排。
402+
*
403+
* 该函数会根据 `orderedNodes` 的顺序对 `nodes` 中的节点进行排序。
404+
* 如果 `nodes` 中的某些节点不在 `orderedNodes` 中,这些节点会被附加到排序后的数组末尾。
405+
*
406+
* @param {Array} nodes - 需要重排的节点数组,可能包含游离节点。
407+
* @param {Array} orderedNodes - 有序节点列表,表示期望的节点顺序。
408+
* @returns {Array} - 返回按照 `orderedNodes` 顺序重排后的节点数组,游离节点会附加到末尾。
409+
*
410+
* @example
411+
* const nodes = ['F', 'E', 'D', 'C', 'B', 'A'];
412+
* const orderedNodes = ['B', 'D', 'A', 'C'];
413+
* const sortedNodes = reorderNodes(nodes, orderedNodes);
414+
* console.log(sortedNodes); // 输出: ['B', 'D', 'A', 'C', 'F', 'E']
415+
*
416+
* @example
417+
* const nodes = ['X', 'Y', 'Z', 'A', 'B'];
418+
* const orderedNodes = ['A', 'B', 'C'];
419+
* const sortedNodes = reorderNodes(nodes, orderedNodes);
420+
* console.log(sortedNodes); // 输出: ['A', 'B', 'X', 'Y', 'Z']
421+
*/
422+
const reorderNodes = (nodes, orderedNodes) => {
423+
// 创建一个 Map,用于快速查找节点在 reachableNodes 中的索引
424+
const nodeOrder = new Map();
425+
orderedNodes.forEach((node, index) => {
426+
nodeOrder.set(node, index);
427+
});
428+
429+
// 将 nodes 中的节点按照 orderedNodes 的顺序进行排序
430+
// 不在 orderedNodes 中的节点会被放在最后
431+
return nodes.slice().sort((a, b) => {
432+
const indexA = nodeOrder.has(a) ? nodeOrder.get(a) : orderedNodes.length;
433+
const indexB = nodeOrder.has(b) ? nodeOrder.get(b) : orderedNodes.length;
434+
return indexA - indexB;
435+
});
436+
};
437+
400438
/**
401439
* 启动调试.
402440
*
403441
* @return {*} 调试的节点列表.
404442
*/
405443
self.testRun = () => {
406-
self.getNodes().forEach(node => {
444+
const allNodes = self.getNodes();
445+
allNodes.forEach(node => {
407446
node.isActiveInFlow = false;
408447
});
409448
const startNode = self.getStartNode();
410-
self.getReachableNodes(startNode).forEach(node => {
449+
const reachableNodes = self.getReachableNodes(startNode);
450+
reachableNodes.forEach(node => {
411451
node.isActiveInFlow = true;
412452
});
413453
self.isRunning = true;
414-
const nodes = self.sm.getShapes().filter(s => s.isTypeof('jadeNode')).filter(s => s.runnable !== false);
415-
nodes.map(n => {
416-
const h = self.createRunner(n);
417-
n.ignoreChange(() => {
418-
h.testRun();
419-
});
454+
const nodes = allNodes.filter(s => s.runnable !== false);
455+
const orderedNodes = reorderNodes(nodes, reachableNodes);
456+
orderedNodes.map(n => {
457+
const runner = self.createRunner(n);
458+
n.ignoreChange(() => runner.testRun());
420459
});
421-
return nodes;
460+
return orderedNodes;
422461
};
423462

424463
/**

0 commit comments

Comments
 (0)