3

我正在寻找一种有时暂停操作(函数/方法调用)的好方法,直到用户确认他想要执行该操作的特定部分。我需要在不允许代码执行停止的环境中执行此操作(在我的情况下为 ActionScript,但 JavaScript 的方法应该相同)。

为了说明,这是在引入用户提示之前的动作模型:

<preliminary-phase> // this contains data needed by all the following phases //

<mandatory-phase> // this will be always be executed //

<optional-phase> // this will always execute too, if in this form, but in some cases we need to ask the user if he wants to do it //

<ending-phase> // also mandatory //



我需要的是插入一个有条件的用户提示,一个“你想要做这部分吗?”,并且<optional-phase>只在用户想要的时候做。

<preliminary-phase>

<mandatory-phase>

if(<user-confirmation-is-needed> and not <user-response-is-positive>){
    <do-nothing>
}
else{
    <optional-phase>
}

<ending-phase>



当尝试在 ActionScript/JavaScript 中执行此操作时,我得到了如下信息:

<preliminary-phase>

<mandatory-phase>

if(<user-confirmation-is-needed>){
    askForConfirmation(callback = function(){
        if(<user-response-is-positive>)
            <optional-phase>
        <ending-phase>
    });
    return;
}

<optional-phase>

<ending-phase>

现在两者<optional-phase><ending-phase>都是重复的。也因为他们使用创建的对象,<preliminary-phase>如果不将所有数据传递给这些函数,我就无法将它们移动到外部函数。


我目前的解决方案是,在我要求确认之前,我将每个<optional-phase><ending-phase>在一些本地函数中(以便它们可以访问数据<preliminary-phase>)包含在内,并且我调用这些函数而不是复制代码,但似乎不对代码不再按执行顺序排列。

你们会推荐什么?

注意事项:
1.askForConfirmation是一个非阻塞函数。这意味着在其调用之后的代码会立即执行(这就是为什么我的return;方法中有一个)。

4

4 回答 4

3

注意:我不能 100% 确定我了解您的确切情况。

命令模式可能适合这里。这与人们的建议相似。

您有一组按顺序执行的命令。

[<preliminary-phase>, <mandatory-phase>, <optional-phase>, <ending-phase>]

只需一次将命令从数组中移出一个,然后调用 execute 方法。

在可选阶段,检查是否需要用户确认,如果不需要,则执行可选的代码方法,该方法调度命令完成事件,如果需要,则显示警报,等待事件,检查结果,然后调度命令完成事件或调用可选方法(它将运行然后调度命令完成)。

您还可以创建命令树,这样可以清楚地说明执行流程,而不必弄乱数组。

这就是安装向导等程序的工作方式。

这样做的好处是执行顺序很好且可见,并且您的代码很好地分解为块,并且封装了每个步骤的复杂性。例如,可选阶段对结束阶段一无所知。可选阶段只知道用户在执行之前可能需要提示,它会在内部处理所有这些。

http://en.wikipedia.org/wiki/Command_pattern

“使用命令对象可以更轻松地构建需要在选择的时间委派、排序或执行方法调用的通用组件......”

于 2010-11-09T18:45:16.270 回答
1

“代码不再按照它的执行顺序”实际上对我来说似乎很好。只要代码清晰,就可以编写不按执行顺序编写的代码。实际上,由于您的代码以可变顺序执行,我认为您不可能在不复制代码的情况下按照执行顺序编写它,这是一个更大的邪恶。选择好的函数名称,您的方法将通过我的代码审查。

<preliminary-phase>

<mandatory-phase>

var optional_phase = function() {
  <optional-phase>
}

var ending_phase = function() {
  <ending-phase>
}

if(<user-confirmation-is-needed>){
    askForConfirmation(function(){
        if(<user-response-is-positive>)
            optional_phase();
        ending_phase();
    });
    return;
}

optional_phase();
ending_phase();
于 2010-11-09T16:02:10.243 回答
0

不是一个巨大的变化,但如果这个流程有效,可选阶段不会重复

<preliminary-phase>

<mandatory-phase>

if(<user-confirmation-is-needed>){
    askForConfirmation(function(){
      if(<user-response-is-negative>)
      {
        <ending-phase>
        return;
      }
  });
}

<optional-phase>
<ending-phase>
于 2010-11-09T17:08:02.320 回答
0

这是否符合您的要求?

<preliminary-phase>

<mandatory-phase>

if(<user-confirmation-is-needed>){
    askForConfirmation(function(){
        if(<user-response-is-positive>)
            <optional-phase-as-local-function>
        <ending-phase-as-local-function>
    });
} else {
    <optional-phase-as-local-function>
    <ending-phase-as-local-function>
}
于 2010-11-09T16:05:18.113 回答