我可以在javascript上启动一系列事件吗?单击函数?

我可以在javascript上启动一系列事件吗?单击函数?,javascript,onclick,Javascript,Onclick,你好 在JavaScript的onclick函数中,我有一系列我希望按顺序发生的事件。但是,当我添加几个更新db的.post函数时,它不起作用。在onclick函数中不能有超过1.post函数吗?这是我的代码,在这里添加更多的文本,因为网站不允许我发布说我需要添加更多的细节,因为我发布了大部分代码。请帮忙,期待您的帮助 $('#vesmos').click(function(){ var dt = new Date(); var dformat = dt.getFullYear(

你好

在JavaScript的onclick函数中,我有一系列我希望按顺序发生的事件。但是,当我添加几个更新db的.post函数时,它不起作用。在onclick函数中不能有超过1.post函数吗?这是我的代码,在这里添加更多的文本,因为网站不允许我发布说我需要添加更多的细节,因为我发布了大部分代码。请帮忙,期待您的帮助

$('#vesmos').click(function(){
    var dt = new Date();
    var dformat = dt.getFullYear() + "/"
                + (dt.getMonth()+1)  + "/" 
                + dt.getDate()  + " "  
                + dt.getHours() + ":"  
                + dt.getMinutes() + ":" 
                + dt.getSeconds();
    //set start and end date on form fields
    if($.trim($('#stdt').val()) == ''){
        $('#stdt').val(dformat);
     }

    $('#enddt').val(dformat);

    //update rt table close rt log (code does not when I add this function)
    $.post("closert-docadminus.php",
    {
        empname: $("#empname").val(),

    });

    //calculate start and end date
    var strt = $('#stdt').val();
    var end = $('#enddt').val();

    var d2 = new Date(strt);
    var d1 = new Date(end);
    $('#insec').val(parseFloat(((d1-d2)/1000).toFixed(2)));
    $('#inmin').val(parseFloat(((d1-d2)/60000).toFixed(2)));
    $('#inhrs').val(parseFloat(((d1-d2)/3600000).toFixed(2)));

    //save to ams table logs
    $.post("savesettings.php",
    {
        empname: $("#empname").val(),
        task: $("#task").val(),
        dttoday: $("#dttoday").val(),
        stdt: $("#stdt").val(),
        enddt: $("#enddt").val(),
        insec: $("#insec").val(),
        inmin: $("#inmin").val(),
        inhrs: $("#inhrs").val(),
        pltform: $("#pltform").val(),

    });

    //clear textboxes
    $('#stdt').val("");
    $('#enddt').val("");
    $('#task').val("");
    $('#pltform').val("");


    //fill textboxes
    $('#task').val("Mail Open/Sort");
    $('#pltform').val("VES");
    $('#stdt').val(dformat);
    $('#statype').val("Occupancy");
    $('#statprio').val("Primary");

    // save log to rt table (code does not when I add this function)
    save to realtime
    $.post("savert-docadminus.php",
    {
        empname: $("#empname").val(),
        task: $("#task").val(),
        stdt: $("#stdt").val(),

    });
});

你要做的是一组并发的

根据浏览器的不同,您将有一组最大并发XHR,其中有一个列表。但即使它们太多,它们也会排队,因此浏览器会在将来发送它们

您试图在单击事件处理程序中创建3个并发XHR,我不认为这是一个问题。仅仅说“它不起作用”并不能提供足够的问题信息,您需要进行挖掘和调试

以下是我建议您做的:

1,打开开发工具中的“控制台”选项卡,检查控制台中是否存在任何阻止调度XHR的JavaScript错误

2、打开开发者工具中的“网络”选项卡,检查XHR是否有效调度;如果是,请检查服务器响应是什么

3,在.post调用append.done和.fail回调中,确认服务器正在响应什么,例如:

$.post("some.php", data: { name: "John", location: "Boston" })
  .done(function (response) {
      console.log(response);
  })
  .fail(function (jqXHR, textStatus, errorThrown) {
      console.log(textStatus);
      console.log(errorThrown);
  });

这将引导您找到问题的根本原因

您可能会遇到重大事件。这不起作用,因为Javascript是异步的。 所有的I/O调用都是异步的,所以第三个调用可以第一个完成,但第二个调用可以最后完成。
您应该了解有关Javascript事件循环的更多信息。

鉴于OP在评论部分澄清了“问题”是:一个接一个地调度XHR,我将添加关于如何实现它的第二个答案,但首先,我将尝试简要解释为什么在一个接一个地添加$.post调用不起作用

默认情况下,XMLHTTPRequests是异步的。这迫使您在异步域中思考,并假设调用:

asyncFunction1() ($.post)
asyncFunction2() ($.post)
并不意味着asyncFunction1结束执行时将执行asyncFunction2

  • 这并不意味着JavaScript是并行多线程的。JavaScript是单线程和异步的,它使用事件循环来解析代码执行。了解更多关于它的信息
  • Ajax(XMLHTTPRequests-$.post)是一种特定于浏览器的功能。。。浏览器可能会打开一个单独的线程来发送请求,但这并不重要,因为记住,在编程语言级别(JavaScript),我们没有线程
  • 好吧,回到问题上来,如果我们想在异步函数结束后立即执行代码呢

    实现这一目标有多种模式:

  • 通常,异步函数应该为您提供一个API,至少是一个好的旧回调

    根据jQuery.post($.post),可以添加如下回调:

    $.post('url', data).done(function (response1) {
        // Next code here
    })
    
    这将导致您:

    $.post('url1', data1).done(function (response1) {
        // The first XHR finished successfully, we send the second
        $.post('url2', data2).done(function (response2) {
            $.post('url2', data2).done(function (response2) {
                // The second XHR finished successfully, we send the third and so on
                $.post('url3', data3).done(function (response3) {...})
            })
        })
    })
    
    这最终会让你说

    “代码嵌套看起来不好,也不容易维护,我如何才能使它更干净?”


    祝贺您,您已进入

    域。您可以拥有多个post事件。我的猜测是,当它是异步的时,您希望它同步运行。在用新值填充文本框之前,您不需要清除文本框,但这不会导致问题。您也不需要将值放入文本框中,只需将它们与
    $一起发送。post()
    $。post()
    (通常是ajax)是异步的;您的代码不会等待每个请求完成后再继续。@ChrisG但他不使用结果,因此不清楚它是否重要。每个脚本是否要求前一个脚本已经完成,或者它们是独立的?