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

时间:2010-06-21 15:34:57

标签: javascript

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

保存的一部分是检查项目,这些项目可能需要提示用户,允许他们在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 个答案:

答案 0 :(得分:4)

使用回调。将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();
  }
}

答案 1 :(得分:1)

我不明白为什么对话框会异步。我想我真的不明白你在问什么......在我看来,这很简单:

  1. 用户点击“保存”
  2. 保存例行检查以进行验证
  3. 如果需要,会生成弹出窗口,保存被放弃(没有任何异步)
  4. 当用户确认弹出窗口中的选择,或者不需要弹出窗口时,然后启动AJAX内容。
  5. 除非你在验证服务器端,否则,

    1. 用户点击“保存”
    2. 验证例程启动AJAX,成功回调,比方说,validationResponse
    3. validationResponse收到回复,说明保存是否成功,还是需要进一步编辑
    4. 如果没有,你就完成了,保存了东西
    5. 如果需要进一步编辑,请给用户一个机会
    6. 当用户确认编辑时,请从步骤2重做。