所以我写了关于Promise的JavaScript。我在这样的for循环中做出了两个承诺:
for(let i=0; i<globalName.length; i++ ){
let debug = globalName[i];
var promise1 = new Promise(function(resolve,reject){
var j = searchStart(startT,debug);
resolve(j)
}).then(function(result){
sxx = result;
});
var promise2 = new Promise(function(resolve,reject){
var k = searchEnd(endT,debug);
resolve(k);
}).then (function(result){
syy = result;
});
Promise.all([promise1, promise2]).then(function(values) {
let localed = [];
entry[i] = sxx;
exit[i] = syy;
localed.push({
"name" : debug,
"first" : entry[i],
"last" : exit[i]
});
xtable.rows.add(localed).draw();
});
}
在每个Promise中,我调用函数searchStart(startT,debug)
和searchEnd(endT,debug)
,在每个函数中,我还编写了Promise脚本,这些脚本从API(当我从设备调用API时返回值)返回值,返回JSON数据)。 JSON数据工作正常,我可以使用函数访问它并返回一些预期值。
当函数返回值时,使用Promise.all
,我将数据写入DataTables提供的表中。但是当然,因为该函数在上述两个承诺得到解决时运行,所以它只能将每行数据写入我的表中。
现在,我想问的是,我可以先设法以某种方式写入所有数据,然后在数据完成后调用其他函数写入表吗?
答案 0 :(得分:0)
您可以将每个indexOf()
String monthString = dateString.substring(0,dateString.indexOf("/"));
String dayString =
dateString.substring(dateString.indexOf("/"),DateString.indexOf("/")+1)
与其关联的.map
,这样您就有debug
的数组。然后,在之后调用该数组上的Promise.all
,您可以一次添加所有行。
请注意,由于Promise.all
和Promise.all
看起来已经返回searchStart
,因此不需要explicit Promise constructor antipattern-仅使用现有的Promise。另外,通过在searchEnd
内部返回值,可以避免使用外部变量,例如Promises
,.then
,sxx
和syy
:>
entry[i]
exit[i]
用于初始const promiseAlls = globalName.map((debug, i) => {
return Promise.all([
debug, // see below for note
searchStart(startT, debug),
searchEnd(endT, debug)
]);
});
Promise.all(promiseAlls).then((allArrs) => {
allArrs.forEach(([
name, // this is the same as the "debug" variable above
first, // this is the same as `entry[i]`, or `sxx`, in your original code
last // this is the same as `exit[i]`, or `syy`, in your original code
]) => {
const localed = [{ name, first, last }];
xtable.rows.add(localed).draw();
});
});
,即使它不是debug
,也可以在解析后将其传递并与其他关联值一起使用
答案 1 :(得分:0)
我不清楚您想要什么,但是我有两个答案可能会对您有所帮助 解决方案1:它将一次解决每个承诺,然后继续下一个
function searchStartAndEnd(flag = false, date, debug){
return new Promise((resolve, reject)=>{
var j;
if(flag){
j = searchStart(date, debug);
}else{
j = searchStart(date, debug);
}
resolve(j)
})
}
for(let i=0; i<globalName.length; i++ ){
let debug = globalName[i];
sxx = await searchStartAndEnd(true, startT, debug);
syy = await searchStartAndEnd(false, endT, debug) ;
localed.push({
"name" : debug,
"first" : sxx,
"last" : syy]
});
xtable.rows.add(localed).draw();
}
solution 2: It will solve all promise parallel then do move to the next task, then move next iteration
function searchStartAndEnd(flag = false, date, debug){
return new Promise((resolve, reject)=>{
var j;
if(flag){
j = searchStart(date, debug);
}else{
j = searchStart(date, debug);
}
resolve(j)
})
}
for(let i=0; i<globalName.length; i++ ){
let debug = globalName[i];
sxx = await ;
[sxx, syy] = await Promise.all([searchStartAndEnd(true, startT, debug),
searchStartAndEnd(false, endT, debug)])
localed.push({
"name" : debug,
"first" : sxx,
"last" : syy]
});
xtable.rows.add(localed).draw();
}