【问题标题】:Email is getting sent more than once, after Ajax call在 Ajax 调用之后,电子邮件被多次发送
【发布时间】:2017-09-25 23:30:28
【问题描述】:

我正在进行 Ajax 调用以获取数据,我得到了 4 行,而那些我用来通过 toSendEmail() 方法发送电子邮件的行。我需要使用 for 循环进行 Ajax 调用,因为我的 ID 存储在数组中(我正在使用 Id 创建 Ajax 的 URL)..这里是代码:

function getData() {
    console.log("Total Element:"+someIds.length); // 4 data

    for (var i=0; i< someIds.length;i++) {  
        $.ajax({
          url: '/SomeURL/' someIds[i];    
// Basic Ajax Coding (type, cache etc......)

            success: function (result1) {
                for(var i=0; i<result1.length; i++) {
                    // Storing data in Predefined arrays.. 
                }
            },
            error: function (error) {
                alert("Errror while.....");
            }
        }).done(function() {
            if(SomeData.length!=0) {
                toSendEmail();
            };
        });    

    }
}

我的 ajax 调用工作正常我按预期获取数据。我的问题是电子邮件被发送了 4 次。我希望电子邮件功能应该只调用一次。我需要对我的代码进行哪些更改??

谢谢

【问题讨论】:

    标签: javascript jquery ajax email for-loop


    【解决方案1】:

    先获取所有行,然后当ajax调用都完成后,发送电子邮件

    function getData() {
      var promises = [], lines = [];
    
      for (var i = 0; i < someIds.length; i++) {
        var xhr = $.ajax({
          success: function(result1) {
            for (var j = 0; j < result1.length; j++) {
              lines.push(whatever);
            }
          },
          error: function(error) {
            alert("Errror while.....");
          }
        });
    
        promises.push(xhr);
      }
    
      $.when.apply($, promises).done(toSendEmail); // all done
    }
    

    【讨论】:

    • 错误:: xhr 未定义
    • 这对我来说很好,你可能改变了大括号。
    【解决方案2】:

    现在,您在 done() 方法中为每个 Ajax 调用调用您的 toSendEmail 函数,这意味着它将在每次 Ajax 完成时运行。在完成所有 Ajax 之后,您只希望它运行一次,因此请使用 jquery 的 when()。更多信息:Wait until all jQuery Ajax requests are done?

    【讨论】:

    • 我希望 Ajax 调用在 for 循环中运行,因为我通过数组在 URL 中发送 ID
    • 我现在意识到(我认为您的 Ajax 调用是导致电子邮件发送的原因)并已更正了我的答案;对此感到抱歉
    • 我已经有数组在成功函数中用于收集数据并存储在不同的数组中......但是我在帖子中显示的 for 循环从 URL 中的数组传递 ID.. 我将编辑帖子你..
    • 对,但是您在 done() 函数中为多个 Ajax 调用中的每一个调用了 toSendEmail()。相反,您应该只在每个 Ajax 调用完成时才运行该代码,您可以使用 jquery.when 来执行此操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-14
    • 1970-01-01
    • 2014-11-15
    • 2011-08-20
    • 2018-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多