代码之家  ›  专栏  ›  技术社区  ›  BenAlabaster

如何访问同步代码中的异步响应?

  •  2
  • BenAlabaster  · 技术社区  · 14 年前

    我有一个网页,需要用户单击“保存”按钮将表单内容保存回Web服务器。

    保存的一部分是检查项目,这些项目可能需要提示用户,允许他们在javascript弹出窗口中确认、编辑和重新排序项目。

    如果需要提示,我需要能够访问用户的响应,即是否单击了确认或取消按钮;如果单击了取消按钮,则必须停止保存过程;如果单击了确认按钮,则必须继续保存过程:

    同步行为的psuedo代码:

    function SaveData()
    {
    
        if (itemsRequireValidation)
        {
            if (RESPONSE_CANCEL == ConfirmationDialog.Show()) {
                return;
            }
        }
    
        ProcessConfirmData(ConfirmationDialog.OutputData);
    
        //...Do the rest of the save process
    }
    

    鉴于:

    • 确认对话框是一个构建一些HTML输出的JavaScript对象,由于用户单击对话框中包含的确认或取消按钮之前,我们无法真正继续该过程,因此引入了异步行为。

    • 让javascript等待直到用户单击其中一个或另一个的阻塞代码将具有负面行为,这可能会使浏览器崩溃,甚至阻止用户单击其中一个按钮。

    我该如何重构这个对话框,以考虑到对话框本质上是异步的,但我需要像处理同步的那样处理用户交互?

    我想我真的需要从另一个角度来看待这个问题,现在我看不到。

    2 回复  |  直到 14 年前
        1
  •  4
  •   gnarf    14 年前

    使用回调。制作你的 ConfirmationDialog 允许回调函数作为选项,它可以在用户响应时调用这些函数。

    function SaveDate() {
    
      function HandleSave() {
        // process rest of save
      }
      if (itemsRequireValidation)
      {
        ConfirmationDialog.Show({
          RESPONSE_CANCEL: function() {
             // cancelled, do nothing
          },
          RESPONSE_OK: function(output) {
            ProcessConfirmData(output);
            HandleSave();
          }
        });
      } else {
        HandleSave();
      }
    }
    
        2
  •  1
  •   Amadan    14 年前

    我不明白为什么对话是异步的。我想我不太明白你在问什么…在我看来,这很简单:

    1. 用户单击保存
    2. 保存例行检查以进行验证
    3. 如果需要,将生成弹出窗口,放弃保存(还没有异步操作)
    4. 当用户在弹出窗口中确认选择,或不需要弹出窗口时, 然后 启动Ajax工具。

    除非是在服务器端进行验证,在这种情况下,

    1. 用户单击保存
    2. 验证例程启动Ajax,成功回调到,比如, validationResponse
    3. 验证响应 获取一个响应,该响应指示是否保存成功,或者是否需要进一步编辑
    4. 如果没有,你就完了,东西就保存了。
    5. 如果需要进一步编辑,请给用户一次机会
    6. 当用户确认编辑后,从步骤2重新执行。