我编写了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
从时间戳返回自定义日期格式。
searchStart
,searchEnd
从设备调用API后异步返回值。
initDatatable
将最终数据打印到数据表