@@ -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