在每次 ajax 插入后增加一个计数器,然后将其显示为消息

Posted

技术标签:

【中文标题】在每次 ajax 插入后增加一个计数器,然后将其显示为消息【英文标题】:increment a counter after each ajax insert then show it as a message 【发布时间】:2022-01-11 02:34:27 【问题描述】:

我正在使用 Ajax 通过 php 将数据插入 mysql,请参阅下面的代码:

var c = 0;//initialize counter
function add()
  for (var i = 0; i < 10; i++) 
    $.ajax(
      type: "POST",
      url: "insert.php",
      data: 
        id: id,
        name: name,
        email: email,
      ,
      dataType: "json",
      success: function (res) 
        c++;//increment counter
      ,
    );
  
  alert(c);//display counter

我想要做的是在 for 循环结束后显示警报(插入操作完成的次数)。我已经像上面的代码那样做了它不起作用。它总是显示为零。

有没有办法实现同样的功能?

【问题讨论】:

要显示您需要将alert(c) 放入success 处理函数中的值。但是,此代码存在一些主要问题。首先,alert() 会在通知被解除之前阻止 JS 继续。我强烈建议您改用console.log(c)。其次,用 10 个请求淹没你的服务器是一个非常糟糕的主意。你的实际目标是什么 - 因为这段代码似乎是多余的。 我使用 alert 只是为了测试。你这样做的替代方法是什么?我正在使用学生评分表,我想将每条记录插入数据库。 向您的服务器发送一个请求,其中包含所有 10 个学生的详细信息,然后在服务器端循环访问数据 当前代码的另一个问题是 Ajax 是异步的(非阻塞),因此警报将在第一个响应甚至返回到客户端之前立即执行。 @Rory McCrossan,您能否提供一个代码示例作为答案?你的建议是什么? 【参考方案1】:

这种方式行得通。

var c = 0;
async function add() 
    for (var i = 0; i < 10; i++) 
        await $.ajax(
            type: "POST",
            url: "https://upwork.codefusiontm.com/stack/002",
            data: 
                id: "id",
                name: "name",
                email: "email",
            ,
            dataType: "json",
            success: function (res) 
                c++;//increment counter
            ,
        );
    


$(() => 
    add().then(() => 
        console.log("=>",c)
    )
)

您需要使用 promiseasyncwait。您使用 async 并将 add 方法创建为 async

async function add() 

之后,您在 $.ajax 中添加 await 因为只有这样 ajax 只会在 POST 返回后增加 c++,这必须这样做,因为您在 for 中启动多个 POST,因此必须等待每个完成才能正确递增。

await $.ajax(

综上,你终于可以得到变量c

的值了
$(() => 
    add().then(() => 
        console.log("=>",c)
    )
)

别忘了,方法调用必须在document.ready

中进行
$(() => 
)

【讨论】:

【参考方案2】:

考虑以下内容。

var c = 0; //initialize counter
function add() 
  for (var i = 0; i < 10; i++) 
    $.ajax(
      type: "POST",
      url: "insert.php",
      data: 
        id: id,
        name: name,
        email: email,
      ,
      dataType: "json",
      success: function(res) 
        c++;
        if (i == 10) 
          alert(c); //display counter
        
      ,
    );
  

当你执行最后一个循环时,i 将是 9,然后递增到 10。所以我们可以检查 i 是否等于 10,然后我们知道循环已经运行了最后一次。

【讨论】:

以上是关于在每次 ajax 插入后增加一个计数器,然后将其显示为消息的主要内容,如果未能解决你的问题,请参考以下文章

创建 Windows 自动重启 + 每次重启时递增的计数器

ios:此有效负载格式中的推送通知徽章计数未增加

堆排序和计数排序

如果表中的行不存在,我如何更新或插入它?

如何在 MySQL 中为行保留一个计数器

我应该在发布后还是每次提交时增加版本