如何使用延迟对象等待AJAX​​完成

时间:2017-02-20 17:29:47

标签: javascript jquery ajax promise jquery-deferred

工作流:

宏观目标是不让用户等待任何事情,这是我尝试做的用户流程:

  1. 用户填写表格
  2. 用户点击按钮提交表单
  3. 表单通过AJAX提交异步(FWIW,处理大约需要5秒)
  4. 在表单异步提交后,jQuery立即弹出调查模式
  5. 用户可以填写调查问卷并单击按钮进行提交,也可以单击按钮完全跳过调查
  6. 我现在遇到的问题是用户点击submit-surveyskip-survey后的效果。最先谈论跳过是最容易的。如果用户选择跳过调查,则会发生以下情况:

    1. A"工作"只要异步需要仍然完成(如果需要的话),页面上会出现覆盖,因为一旦异步完成,它将返回需要在jQuery代码中发生的右下一个动作(例如,让&#39 ; s说这是一个简单的console.log
    2. 如果用户填写调查并点击submit-survey,那么会发生以下情况:

      1. 调查通过AJAX提交异步
      2. A"工作"只要async需要仍然完成(与单击skip-survey完全相同),页面上就会显示覆盖图。
      3. 额外的复杂性是,调查提交到不同的路线,具体取决于用户点击submit-survey时是否完成了第一个表单

        代码

        我借此机会了解更多有关异步流程的信息,这就是代码混乱的原因。现在我正在考虑的实施是,表单提交AJAX,一旦成功或失败,就会生成1)适当的调查提交URL和2)提交或调查最终触发的下一个操作)

        就像......

        $.ajax({
          type : "POST",
          url :  '/orders/create_or_update',
          dataType: 'json', 
          contentType: 'application/json',
          data : JSON.stringify(params)
        })
        .done(function(){
          // submit-survey post route
          submit-url = '/orders/success_ajax_update'
          // next action triggered by skip-survey and submit-survey
          function nextAction() { console.log("fail") }
        })
        .fail(function(){
          // submit-survey post route
          submit-url = '/almost_orders/fail_ajax_update'
          // next action triggered by skip-survey and submit-survey
          function nextAction() { console.log("fail") }
        })
        
        $(document).on("click", "#submit-survey", function() {
          if (isFunction(nextAction)) {
            $.ajax({url: submit-url, ... })
            nextAction()
          } else {
            addWorkingOverlay();
          }
        })
        
        $(document).on("click", "#skip-survey", function() {
          if (isFunction(nextAction)) {
            nextAction()
          } else {
            addWorkingOverlay();
          }
        })
        

        上面的问题是,如果用户在AJAX完成之前点击了submit-surveyskip-survey,那么就会添加工作叠加层,但是没有任何内容可以说明了#34;哦现在AJAX已完成,nextAction已定义,因此再次循环#34;。显然我可以添加一个计数器来检查isFunction(nextAction),但这似乎首先完全打败了AJAX的目的。

        关于如何解决这个问题的想法?

        有新意,需要更多帮助才能充实。根据文档,您可以像这样使用jQuery' .when

        $.when( $.ajax( "/page1.php" ), $.ajax( "/page2.php" ) )
          .then( myFunc, myFailure );
        

        这可以在我的情况下工作,而不是一秒.ajax我点击按钮(提交或跳过)。有了这个想法的问题就是,如何将用户点击提交或跳过按钮转换为.when可以使用的已解决延迟?

0 个答案:

没有答案