【问题标题】:Why my program is executing both if and else?为什么我的程序同时执行 if 和 else?
【发布时间】:2018-06-14 12:21:15
【问题描述】:

我的程序以一种非常奇怪的方式响应。当我单击按钮并调用 selectService() 时,它会正确处理,但最后的 if/else 语句表现得很奇怪,因为它显示了 ifelse 部分的消息。有时它会显示旧消息,然后显示新消息。

var i = 0;

function selectService() {
  $("#tblServices tr").filter(':has(:checkbox:checked)').each(function() {
    //i = 1; // to check if the looping has been done or not
    //alert(i);

    var url = '@Url.Action("CreateInvoice")';
    var data = {
      fk_BookingID: $("#Booking_ID").val(),
      fk_ServiceID: $("td:eq(0)", this).text()
    }

    $.post(url, data, function(response) {
      if (response.ReturnStatusJSON === true) {
        alert(response.ReturnStatusJSON);
        return true;
      } else {
        swal("Sorry !", response.ReturnMessageJSON, "error");
        return false;
      }
    });

    i = 1;
  });

  if (i === 0) {
    swal("Sorry !", "You must select at least one service", "error");
    return;
  }

  if (i > 0) {
    var url2 = '@Url.Action("UpdateBookingInvoiceGeneration")';
    var data2 = {
      Booking_ID: $("#Booking_ID").val()
    }

    $.post(url2, data2, function(response) {
      if (response.ReturnStatusJSON === true) {
        swal("Done", response.ReturnMessageJSON, "success");
        $('.selectColumn').prop("checked", false);
        return;
      } else {
        swal("Sorry !", response.ReturnMessageJSON, "error");
      }
    });
  }
}

发生了什么事?为什么它会这样?我使用的是最新版本的 Chrome。

更新:

我在调试时看到了一个非常不同的问题。我在表中选择了 3 个复选框,每个循环 应该至少运行 3 次,但一开始它运行了 2 次并跳转到 if(i>0),执行完后又跳到 select services 函数并运行第三次检查,剩下的一个。

【问题讨论】:

  • 不清楚你在描述什么。一方面,您的 AJAX 调用是在循环中进行的。那么你为什么不期望它被多次制作呢?至于 if/else,我们可以向您保证的一件事是该代码的任何给定实例绝对不会执行这两个块。但是由于您使用可能不同的运行时值多次执行该代码,因此您所看到的听起来像是预期的行为。那么具体是什么问题呢?
  • 它不能来自同一个HTTP请求,所以我猜它要么是来自.each()的新请求,要么是selectService()被调用了两次。尝试添加一些日志:) PS。很确定你只能做if (response.ReturnStatusJSON)
  • @Stacky:我不确定那条评论应该是什么意思。但我确信的一件事是您需要调试并减少问题。当发生特定和意外的事情时,这就是您调试的地方。确定调试器中到底发生了什么。在哪一行代码上发生了意想不到的事情?输入是什么?你期待会发生什么?为什么?
  • @Stacky:好的,在这种情况下,“问题”是什么?对于i 的任何给定值,您期望if (i > 0) 做什么?
  • 看起来您希望从第一个 post done 处理程序返回来打破每个循环。他们没有,循环在第一个 AJAX 调用运行完成处理程序之前执行。这意味着,在第一个 if 的条件下,i 永远不会是 0。这也意味着,在if 运行时,第二个if 总是通过(i 总是1)。然后是奇怪的部分,response.ReturnStatusJSONresponse.ReturnMessageJSON 是什么,$.post 这里不是 jQuery 帖子?

标签: javascript jquery asp.net-mvc razor


【解决方案1】:

我想我有点理解你想要做什么,并且使用变量来检查 .each 中的块是否已被执行是不好的做法。使用同步请求也是如此。

这里有一个建议,希望对你有帮助

function selectService() {

    // First, manage the case where the user didn't select a service
    if ($("#tblServices tr").filter(':has(:checkbox:checked)') === null) { // or check array length
        swal("Sorry !", "You must select at least one service", "error");
        return;
    }

    // Then, if he has
  $("#tblServices tr").filter(':has(:checkbox:checked)').each(function() {
    var url = '@Url.Action("CreateInvoice")';
    var data = {
      fk_BookingID: $("#Booking_ID").val(),
      fk_ServiceID: $("td:eq(0)", this).text()
    }

    // Do your first request
    $.post(url, data, function(response) {
      if (response.ReturnStatusJSON === true) {
        alert(response.ReturnStatusJSON);

        var url2 = '@Url.Action("UpdateBookingInvoiceGeneration")';
        var data2 = {
          Booking_ID: $("#Booking_ID").val()
        }
    
        // Still in the callback, do the second one if you want it done AFTER
        // getting the result for the first one
        $.post(url2, data2, function(response) {
          if (response.ReturnStatusJSON === true) {
            swal("Done", response.ReturnMessageJSON, "success");
            $('.selectColumn').prop("checked", false);
            return;
          } else {
            swal("Sorry !", response.ReturnMessageJSON, "error");
          }
        });

        return true;
      } else {
        swal("Sorry !", response.ReturnMessageJSON, "error");
        return false;
      }
    });

  });

}

【讨论】:

  • “使用异步请求也是如此”...您的意思是“使用同步请求也是如此”吗?
猜你喜欢
  • 2021-12-18
  • 2015-09-07
  • 2020-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多