Javascript 在进程中间提示用户进行确认

Javascript 在进程中间提示用户进行确认,javascript,actionscript-3,user-interaction,code-separation,Javascript,Actionscript 3,User Interaction,Code Separation,我正在寻找一种好的方法来暂停某个操作(函数/方法调用),直到用户确认他想要执行该操作的特定部分。我需要在一个不允许代码执行停止的环境中(在我的例子中是ActionScript,但是JavaScript的方法应该是相同的) 为了举例说明,这是在引入用户提示之前的操作模型: <preliminary-phase> // this contains data needed by all the following phases // <mandatory-phase> //

我正在寻找一种好的方法来暂停某个操作(函数/方法调用),直到用户确认他想要执行该操作的特定部分。我需要在一个不允许代码执行停止的环境中(在我的例子中是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 //
//包含以下所有阶段所需的数据//
//这将始终被执行//
//如果以这种形式,这也将始终执行,但在某些情况下,我们需要询问用户是否愿意这样做//
//也是强制性的//


我需要的是插入一个有条件的用户提示,一个“您想做这部分吗?”,并且仅当用户想做时才执行

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

if(){
askForConfirmation(回调=函数(){
if()
});
返回;
}
现在
都被复制了。另外,因为它们使用在
中创建的对象,我无法将它们移动到外部函数,而不将所有数据传递给这些函数


我目前的解决方案是,我将
中的每一个都包含在一些本地函数中(这样它们就可以访问
中的数据),在我请求确认之前声明这些函数,我调用这些函数而不是复制代码,但代码不再按照执行顺序执行似乎是不对的

你们推荐什么

注:

1.
askForConfirmation
是一种非阻塞功能。这意味着调用后的代码会立即执行(这就是为什么在我的方法中有一个
返回;

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

<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();

var可选_相位=函数(){
}
var结束阶段=函数(){
}
if(){
askForConfirmation(函数(){
if()
可选_相位();
结束_阶段();
});
返回;
}
可选_相位();
结束_阶段();

这能满足您的要求吗

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

if(){
askForConfirmation(函数(){
if()
});
}否则{
}

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

<preliminary-phase>

<mandatory-phase>

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

<optional-phase>
<ending-phase>

if(){
askForConfirmation(函数(){
if()
{
返回;
}
});
}

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

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

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

[<preliminary-phase>, <mandatory-phase>, <optional-phase>, <ending-phase>]
[,]
只需将命令从数组中逐个移出,然后调用execute方法

在可选阶段,检查是否需要用户确认,如果不需要,则执行可选代码方法以分派命令完成事件,如果需要,则显示警报、等待事件、检查结果并分派命令完成事件或调用可选方法(将运行该命令,然后发送一个完整的命令)

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

这就是安装向导之类的程序的工作方式

它的好处在于,执行的顺序是好的和可见的,代码被很好地分解成块,并且每个步骤的复杂性都被封装。例如,可选阶段不知道任何关于结束阶段的信息。可选阶段只知道用户在执行前可能需要提示,它处理所有这些信息在内部没有

“使用命令对象可以更容易地构造需要委派、顺序或在选择时执行方法调用的常规组件…”


通过删除
返回
所做的是让
之前执行。这肯定是不好的。请注意,主函数不会等到用户选择是/否,它将完成所有代码的执行。此外,我正在寻找最佳实践。我已经在使用一个实用的解决方案。如果
askForConfirmation
像javascript
confirm
命令一样被阻止。但是,@Alin说,“我需要在不允许代码执行停止的环境中执行此操作。”我想这意味着他的
askForConfirmation
不会阻塞,这意味着如果需要确认,您的解决方案将在
之前执行没有意识到阻塞问题。当前的编辑如何?它与问题中的第三个代码块有何不同?您似乎不明白我的要求:)。我已经在按你的建议做了。问题是是否有更好的选择。是的,你是对的。很抱歉应该更加关注动作脚本部分,让更多有知识的人回答。我现在已经失去了一些自信,我不是一个ActionScript的人,所以我不确定这是否值得,但我认为答案是:你做得对。考虑到目前为止对我答案的评论,我同意这个答案。
askForConfirmation
是非阻塞的。。。我将对问题进行编辑,以便更清楚地说明这一点。