为什么值在promise.all()上得到null ?



在快速排序函数下,当我使用Promise.all()值列表时,有时会取空值,

在快速排序

(在快速排序函数中)一切都很好,

无法找出错误。由于错误的可视化发生了,基本上,这是一个快速排序可视化的代码。这在单独的等待中工作得很好,但在await promise.all()中不行。提前感谢……

var w=20;
var values=[];
var state=[];
async function swep(pindex,end){
await sleep(500);
let k=values[pindex];
values[pindex]=values[end];
values[end]=k;
}
async function quicksort(start,end) {
if(start>=end){
return;
}
let pivot= await partition(start,end);
await Promise.all([quicksort(start,pivot-1)
,quicksort(pivot+1,end)]);
// await quicksort(start,pivot-1);
// await quicksort(pivot+1,end);
return;
}
async function partition(start,end){
pindex=start;
state[end]=-1;
pvalue=values[end];
for(let i=start;i<end;i++){
state[i]=1;
if(values[i]<pvalue){
await swep(pindex,i);
pindex++;
}

}
for(let i =start;i<=end;i++){
state[i]=0;
}
await swep(pindex,end);
return pindex;
}
function setup(){
createCanvas(windowWidth, windowHeight);
values=new Array(floor(width/w));
n=values.length;
state=new Array(n);
for(var i=0;i<values.length;i++){
values[i]=random(20,height);
state[i]=0;
}
quicksort(0,n-1);
}
function draw(){
background(255, 153, 194);
for(let j =0;j<values.length;j++){
noStroke();
if(state[j]==0){
fill(255, 255, 0);
}
else if(state[j]==-1){
fill(255,0,0);
}
else{
fill(0,255,0);
}
if(values[j]==null){
console.log(j);
}
rect(w*j,height-values[j],w,values[j]);
}
}
function sleep(ms) {
return new Promise((resolve) => {setTimeout(resolve, ms);});
}

发生这种情况是因为您没有将一些变量定义为本地变量,特别是pindexpvalue。由于在循环中使用await并使pindex发生变异,因此另一个也在运行此代码的异步任务可能会在该变量中得到不希望的更改。

最新更新