问题标签 [program-flow]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
492 浏览

javascript - javascript 事件处理发生在程序流内部还是外部?

这个问题与Javascript 事件处理和流控制有关,但它超越了一步。仍未回答的问题是:当触发事件并将控制权返回给浏览器时,浏览器是否可以决定首先处理其他事件(由其他脚本或用户操作触发)(A),还是它总是直接处理我的事件(乙)?

javascript 事件处理是发生在程序流外部(A)还是内部(B)? 这个问题很重要,因为在 (B) 的情况下,您可以相信在触发事件和事件处理程序之间没有任何变化,而 (A) 则不提供任何保证。

我的第一个猜测是 (B),stopPropagation() 和 preventDefault() 还能如何工作?但是再想一想,这并不是确凿的证据。

这个问题的真实例子。我正在修改一个富文本编辑器(你好),我希望它具有以下规格:

  • 单击可编辑文本 (#txt) 将激活编辑器,单击外部 #txt 将禁用它。你好在#txt 上使用模糊和焦点事件来实现这一点。
  • 激活编辑器会打开一个工具栏,工具栏上的 mousedown(但不是按钮上的)将设置一个标志,以防止 #txt 上的模糊事件停用编辑器。工具栏将焦点返回到#text。
  • 工具栏按钮上的 mousedown 也应该防止停用编辑器,但它应该首先等到单击事件,执行其操作,然后将焦点返回到 #txt。一些动作是即时的(粗体或斜体),而另一些则需要额外的用户输入(从下拉列表中选择)。
  • 其中一些按钮会打开一个对话框。
  • ...而且我希望所有这些元素(编辑器、工具栏、对话框)都是模块化的并且易于扩展。

现在在大多数情况下,当您关闭对话框时,您希望焦点返回到#txt。但是如果打开了一个对话框并且您单击页面上的其他位置,编辑器将关闭并调用工具栏,包括要关闭的对话框。如果在这种情况下对话框将焦点返回给编辑器,它将再次激活编辑器。

据我现在了解,事件处理顺序至少是确定性的。某些事件不可能延迟,而其他事件处理得更早。这就是“同步”的含义。当然,加载文件之类的事件除外。

从程序组件的角度来看,比如对话框,情况可能非常不可预测。它可以将处理程序绑定到打开事件,然后调用 dialog("open"),但调用和处理程序之间可能发生任何事情,只要因为编辑器在同一事件上有一个事件处理程序。

所以我的结论是 1)是的,它是可以预测的,但是 2)它需要一个复杂的架构来实现它。

0 投票
1 回答
935 浏览

java - 侦听器和验证/重绘

所以我有这个问题。我有一个创建和加载文件的程序。

当我将文件加载到我的程序中时,我依靠一个组件侦听器来告诉我特定组件何时“满”,然后根据它移动所有组件。

我在顶部添加每个组件,然后在父组件“填充”时注册侦听器并将底部组件移动到它也创建的新父级。可以把它想象成在一个百页的 MSWord 文档的开头添加一个新的文本行。

该侦听器还依赖于 GUI 设置 - 如果内存中的所有内容都没有绘制到屏幕上,它会抓取错误的组件高度(通常为 0)并在计算中使用它们,然后结果就会出错,一切都会变得一团糟。

这是我的程序那部分的流程图:

(everytning 发生在 JFrame 中的 JPanel 上)

这样做的原因可能是重绘/验证是 addComponent 方法以及侦听器具有其他功能,并且在其他地方被调用,而这是重绘/验证的唯一(最佳)位置。

问题是 JFrame 在 opeoning 方法中的最后一次(最终)验证/重绘调用之前不会被重绘。我尝试将 Thread.sleep(1000) 添加到代码中的几个位置(在验证/重绘之后)来证明这一点。

另外,据我所知,当触发组件侦听器时,它会停在触发它的行,然后执行自身,然后从该行继续,对吗?

我该如何解决?在添加每个新组件之后,如何强制我的程序重新绘制/验证,然后在监听器完成它的工作之后再次?

回复前两条评论:首先,Thread.sleep(1000) 只是为了诊断问题。就在 Thread.sleep(1000) 方法是 repaint/validate 方法之前,所以我想如果我在调用 reapint() 之后立即暂停程序,每次暂停后,GUI 都会重新绘制广告,我会看到添加了新元素,这不是案子。

其次,对于冗长的计算,这些计算并没有那么长(使用 20 个组件执行此操作会得到暂时的结果,尽管不是所需的结果)。此外,该计算需要经常(每 10-20 行)向 GUI 中删除和添加组件,因此将 SwingWorker 纳入其中几乎是不可能的,也不需要。

第三,我认为你没有抓住重点。执行时间不是这里真正的问题,也不是 GUI 的冻结(这并没有真正发生,无论如何都不足以引起注意)。问题是每个组件在循环中调用了 repaint/validate 总共 3-4 次(如果我打开一个包含 20 个组件的文件,cca. 60-80 次),我唯一看到它被执行的时间是最后一次调用它,在循环之后......

我什至在重绘/验证之前和之后放置了 System.out.println("something") 方法。它两次打印出“某事”,但从未发生过重新绘制/验证。

0 投票
0 回答
745 浏览

gcc - 如何使用 NCC (nccgen/nccnav)?

我想了解如何使用名为 NCC 的工具: http: //students.ceid.upatras.gr/~sxanth/ncc/

其目的是详细说明程序调用图和内部符号依赖关系,类似于 cflow/cscope。但我无法让它工作。

我已经克隆了 tcpdump 项目的 git repo 并编辑了 MakefileCC以指向nccgen -ncgcc -ncld -ncfabs而不是CC = gcc

这是输出:

make[1]: Entering directory `/home/rostamn739/Software/tcpdump'

make[1]: Nothing to be done for `all'.

make[1]: Leaving directory `/home/rostamn739/Software/tcpdump'

没有.nccout生成文件

0 投票
2 回答
1372 浏览

python - Python转换计算器循环/代码效率

以下是我在 Python 2.7 中构建的一个简单的密耳到度数转换计算器的(半)成品版本,作为学习练习。我是 Python 新手,仍在解决问题。前提是,用户选择将密耳转换为度数,反之亦然。用户输入所选单位的方位角并将其转换为另一个。如果用户选择了无效的菜单选项,他会收到这样的通知。如果他进入范围之外的方位角(度数为 1-360,密耳为 1-6400),他会收到通知并且必须重新开始。问题是如果用户输入了一个无效的方位角,比如 365 度,他会被踢回菜单。有没有办法返回到 if/else 循环中的上一步?我搜索了论坛和文档,但似乎不可能。另外,由于我是 Python 新手,如何使这段代码更高效?我是否需要在函数定义中包含ifelif语句,或者我可以将它们组合起来而不会产生错误或冗余输出?我这样做并不成功。欢迎和赞赏所有意见。

0 投票
5 回答
572 浏览

function - 在没有 if-else / switch-case 语句的情况下控制程序流程

假设我有 1000 个函数定义如下

我想编写一个函数,它需要一个整数 n (n < 1000) 并根据需要调用 nth 个虚拟函数(如果是 10,则为 dummy10),并带有恰好 n 个参数(参数可以是任何整数,比如说 0)。我知道这可以通过编写一个包含 1000 个案例的 switch case 语句来实现,这是不合理的。

在我看来,如果不在运行时重新编译,这是无法实现的,所以像 java、c、c++ 这样的语言永远不会让这样的事情发生。

希望有办法做到这一点。如果是这样我很好奇。

注意:这不是我永远不会使用的东西,我只是出于好奇而提出问题。

0 投票
1 回答
628 浏览

python - 条件脚本退出和委派控制

我想知道脚本退出的控制应该放在进程的哪个位置?

如果一个函数用来判断一个脚本是否应该继续执行,应该根据结果控制在调用者还是被调用者?

有没有可能出现的情况?

(我确信这个问题具有更广泛的含义,因此请随时将答案扩展到更高级别的编程实践。这实际上会很棒)

我将在下面列出一些示例,以作为条件脚本退出的选项以及如何委托或不委托控制。

想象一下should_continue,正在检查提供的 arg 是否有效,并且脚本继续需要其有效性。否则退出。

0 投票
2 回答
840 浏览

java - Java: why is this code not working? Infinite loop?

So as you may be able to tell from my attempt, I'm trying to figure out how I'd make a program which gives the user 5 seconds to enter some lines of text, then the Scanner will count how many lines were entered. I've just started learning Java as my 2nd language, so please try to explain everything as simply as possible :)

I've got two theories as to why it's not working. The first is that nextLine() will return the whole line, regardless of whether it's empty or not meaning rather than NL equaling "", it will actually equal the whole line (ie " "). And my second theory is that I've got no idea what I'm doing and the program flow is all over the place. Anyway, here's my code:

Oh, I forgot to mention hasNext() was what I originally tried:

0 投票
4 回答
255 浏览

c# - 使用异常来控制程序流

让我给你举个例子。我的 aspx.cs 文件中有以下 Web 方法,用于 AJAX 调用:

QuizHelper.GetNextQuestion方法从数据库生成一个新问题,在某些特定情况下会引发以下异常:

  1. QuizNotFoundException:当quizGuid在数据库中找不到给定的测验时。
  2. QuizInvalidException: 出于安全目的而抛出,例如当有人试图破解 HTTP 请求时。
  3. QuizOverException:每个测验有 10 个问题,当用户尝试使用该QuizHelper.GetNextQuestion方法获得第 11 个问题时,会抛出此异常。
  4. QuestionTimedOutException: 你必须在给定的时间内回答一个问题。如果不这样做,则会引发此异常。
  5. Exception:所有其他例外情况都在此分组,其唯一目的是通知用户发生错误,用于 UX 目的。

然后在 Javascript 文件中,ResponseMessage.Status检查并采取相应的措施。

我知道在此代码中使用异常来控制流程是不好的,但是以这种方式进行操作更直观且更简单。更不用说代码对于外人来说更容易理解的事实。

我不确定如何以“正确的方式”毫无例外地重写此代码,但同时保持其简单性。

我错过了什么,有什么想法吗?

更新:一些答案建议使用枚举来返回操作的状态,但我有很多操作,它们都可能导致不同的场景(即我不能对所有操作使用相同的枚举)。在这种情况下,每个操作创建一个 Enum 感觉不是正确的方法。对这个模型有什么改进吗?

0 投票
2 回答
67 浏览

java - 这会是短路的例子吗?

如果我要求用户输入一个 int,并且需要在检查该索引处的数组以查看它是否不为空之前检查它是否在数组的索引范围内,这是否是“短路”的示例?因为如果数组大小只有 5 并且用户输入 15,那么我会得到一个 ArrayIndexOutOfBoundsException。但是如果我先检查输入的数字是否包含0-4,然后再检查数组索引,则可以保证在0-4之间。所以我的问题是:这是“短路”的一个例子吗?我会改写我在代码中所说的话......

0 投票
2 回答
118 浏览

c# - How do I return to the top of the code?

When I Click on a button I use this class I made, so when it doesn't meet the requirements it shows a messagebox, but it just keeps going with the button, like it doesn't go back.

For example, I want the program to go back after one of these messagebox shows up. Now it just go through with button I clicked.

button: