处理多个数据数组以在循环方法内进行promise.all

时间:2018-11-08 07:48:46

标签: javascript promise

我编写了javascript,它通过html 复选框两个Datepicker 输入和两次输入来处理用户的输入。用户应选择复选框,使其只能选择一个或多个,输入两个日期作为日期范围,并输入两个时间范围。用户输入必要的信息后,他们单击按钮以调用此功能:

function clicked(){

    var localedarr = [];

    if($('input:checkbox[name=myListName]:checked').length > 0){
        $('input:checkbox[name=myListName]:checked').map(function(){ 

            localedarr.push(this.value);                

        });
        debugtwo(localedarr);
    }
    else{
        alert("Check name First!!");
    }
}

debugtwo()是处理数据的下一个功能。在里面,我写这样的代码

function debugtwo(arrName){     
    ...some variable processing         

    if(x=="" || y=="" || z=="" || a=="" || betweenDate(b,c)<1 || y<=x || x == y){
        alert("Invalid Field Detected!!");
    }
    else{               
        arrFor.forEach(function(elm){               
            var startT = elm+getMillisecondFromClock(x);
            var endT = elm+getMillisecondFromClock(y);

            var promiseAlls = arrName.map((eachName,i) =>{                  
                return Promise.all([
                    toDate(elm), 
                    eachName, 
                    searchStart(startT, endT, eachName),
                    searchEnd(startT, endT, eachName)
                ]);
            });             
            Promise.all(promiseAlls).then((allArrs) =>{                 
                final_arr.push(allArrs[0]);                                 
                if(final_arr.length == arrName.length*arrFor.length){                       
                    //initDatatable(final_arr);
                }                   
            });         
        });                         
    }           
}

问题是,当我从复选框发送多个校验值时,例如两个名称,Promise.all仅被调用一次,并且仅处理数组中的第一个数据。但是,当我仅使用1个名称时,即使日期范围从Datepicker开始,promise方法也可以轻松处理它并返回Datatable的所有正确数据。

我的假设是,promise方法没有等待arrFor.forEach,或者更确切地说arrFor.forEach循环没有等待诺言首先完成?我的诺言代码有什么问题吗?

仅供参考: arrFor是根据从Datepicker选取的日期范围在00:00:00格式化的每一天的时间戳记。

toDate从时间戳返回自定义日期格式。

searchStartsearchEnd从设备调用API后异步返回值。

initDatatable将最终数据打印到数据表

0 个答案:

没有答案