【问题标题】:Binding a promise to a function将 Promise 绑定到函数
【发布时间】:2017-03-11 06:57:15
【问题描述】:

我一直在尝试向函数添加一个承诺,以便它首先等待函数完成。我已经尝试过$.when.promise() 以及添加一个计数器和一个变量@ 和 inputTNACheck 在 if 语句执行之前。因此,即使checkInput() 将 x 的值更改为 1,if 语句也会在此之前执行并返回 true。我对Javascript 有一点经验(我更喜欢jQuery),但我认为我正在涉足高级领域。任何帮助将不胜感激。

        $(document).on("click", ".updateNewRows", function(){
        $("#inputTNACheck").val("0");  //hidden inputs
        $("#inputSmartCheck").val("0"); //hidden inputs
        var x=0;
        checkInput();
        if(x==0 && $("#inputTNACheck").val()=="0" && $("#inputSmartCheck").val()=="0"){
            $(".newStart").each(function () {
                var get = $(this).closest(".newStart");
                var data = {
                    empID:get.find(".tna_id").val(),
                    smart:get.find(".smart_uname").val(),
                    first:get.find(".f_name").val(),
                    last:get.find(".l_name").val(),
                    date:get.find(".start_date").val(),
                    type:get.find(".type").val()
                };
                $.post('new_user_process_bulk_create_records.php', data, function(data,textStatus) {
                    console.log(textStatus);
                    $("#newUsersTable").remove();
                    $(".updateNewRows").remove();
                    if ($("#returnUsersTable").html()) {
                        $("#newUsersRow").html('<div class="alert alert-success">Updated</div>');
                    }
                    else{
                        location.reload();
                    }

                });
            });
        }   
    });



  function checkInput(){
        $('.newStart').map(function () {    

            var get = $(this).closest(".newStart");

            var id = get.find(".tna_id");
            var smart = get.find(".smart_uname");
            var first = get.find(".f_name");
            var last = get.find(".l_name");
            var type = get.find(".type");
            var smartCheck = $.ajax({
                url: "new_user_validate_bulk_upload.php",
                type: "POST",
                data: {smart:smart.val(), type:'smart'},
                success: function(data) {
                    if(data!="ok"){
                        $("#inputSmartCheck").val("1");
                        smart.css('background-color', 'pink');
                    }
                    else{smart.css('background-color', 'white');}
                }
            });

            var tnaCheck = $.ajax({
                url: "new_user_validate_bulk_upload.php",
                type: "POST",
                data: {tna:id.val(), type:'tna'},
                success: function(data) {
                    if(data!="ok"){
                        $("#inputTNACheck").val("1");
                        id.css('background-color', 'pink');
                    }
                    else{id.css('background-color', 'white');}
                }
            });
            $.when(smartCheck, tnaCheck).then(function() {  

                var name = new RegExp('^[a-zA-Z-]{0,20}$');
                var smartID = new RegExp('^[a-zA-Z0-9]{0,10}$');
                var empID = new RegExp('^[0-9]{0,10}$');

                if (!name.test(first.val()) || first.val()=='') {
                    x=1;
                    first.css('border', '1px solid red');
                }else{first.css('border', '1px solid #CCC');}

                if (!name.test(last.val()) || last.val()=='') {
                    x=1;
                    last.css('border', '1px solid red');
                }else{last.css('border', '1px solid #CCC');}

                if(!smartID.test(smart.val()) || smart.val()==''){
                    x=1;
                    smart.css('border', '1px solid red');
                }else{smart.css('border', '1px solid #CCC');}

                if(!empID.test(id.val()) || id.val()==''){
                    x=1;
                    id.css('border', '1px solid red');
                }else{id.css('border', '1px solid #CCC');}

                if(type.val()==''){
                    x=1;
                    type.css('border', '1px solid red');
                }else{type.css('border', '1px solid #CCC');}
            });//$.when close
        });
    }

【问题讨论】:

    标签: javascript jquery callback promise jquery-callback


    【解决方案1】:

    先了解一些基础知识...

    我无法让 checkInput() 函数完成并更改 x 的值

    x 是在您的事件处理程序中定义的,因此当您在 checkInputs() 中引用它时,即使它在您的事件处理程序中被 调用,它也无权访问已定义的变量在您的事件处理程序的范围内,除非在该事件处理程序中也定义了 checkInputs 函数。 (在这种情况下,我不建议这样做,这意味着您在每次事件处理程序运行时都创建一个函数,这没什么大不了的,但仍然没有必要。)

    在 if 语句执行之前

    因为checkInputs() 执行异步操作,所以您不能仅仅依靠简单地调用它而不通过某种方式来确定它是否已完成。好消息是你在 Promises 上走在了正确的轨道上。

    checkInputs 当前的工作方式,你永远不会知道是否所有的异步工作都在你的if 语句之前完成。让我们用一些基于您的 checkInputs 函数的示例代码来解决这个问题。

    function checkInputs() {
        // an array to store the async calls
        var asyncCalls = [];
    
        // iterate over all the things
        // changed to .each() because "each" is for iterating, 
        // and "map" is for returning a new array
        $('.newStart').each(function() {
            // get all your variables and stuff
            var smartCheck = $.ajax({...});
    
            var tnaCheck = $.ajax({...});
    
            var asyncCallsPromise = $.when(smartCheck, tnaCheck).then(function() {
                // do stuff
    
                console.log(arguments);
            });
            asyncCalls.push(asyncCallsPromise);
        });
    
        // the important part, return a promise so you can check 
        // when checkInputs has processed all the things
        return $.when.apply($, asyncCalls);
    }
    
    // somewhere else...
    checkInputs().then(function() {
      console.log('all the calls are done');
      // here you can do the things that need to happen after checking the inputs
      // e.g. the if statement.
    });
    

    希望这个小小的推动朝着正确的方向有所帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-09
      • 1970-01-01
      • 2019-01-04
      • 1970-01-01
      • 1970-01-01
      • 2017-11-14
      • 2015-12-08
      相关资源
      最近更新 更多