我是Java语言的新手。我对诺言链有疑问。我正在尝试在for loop
内执行链承诺,我想要这样的输出:
一个 二 三 -------- 一 二 三 -------- 一 二 三个
但是我总是得到这样的输出
一个 二 ------- 一 二 ------- 一 二 ------- 三 三 三个
这是我的代码:
test(item: any, i: number){
this.filePath = item.rows.item(i).filepath;
this.fileName = this.filePath.substr(this.filePath.lastIndexOf('/') + 1);
this.imgePath = this.filePath.replace(this.fileName, "");
console.log(this.filePath)
console.log(this.fileName)
console.log(this.imgePath)
const one = new Promise<boolean>(resolve => {
this.readfile.checkFile(this.imgePath, this.fileName).then(isExists => {
console.log("one")
resolve(isExists);
})
});
const two = one.then(isExists => {
console.log("two")
if (isExists) {
return this.readfile.readAsDataURL(this.imgePath, this.fileName).then(res =>{
return res;
})
}
else {
console.log("not exists")
}
})
const three = two.then(res => {
console.log("three")
this.base64Image.push(res);
})
}
process(item: any, rows: number) {
let prom: Promise<void>[] = [];
for (let i = 0; i < rows; i++) {
this.test(item,i);
console.log(i,"loop")
}
}
有人可以帮助我吗?我花了8个小时,但仍然无法解决。谢谢!
答案 0 :(得分:1)
在执行循环中的下一项之前,您不必等待诺言完成。
for
循环不应与异步代码一起使用,除非您希望并行执行它们或使用async await
。
需要进行的更改:
您的测试方法应返回promise,以便我们可以跟踪何时实现promise。
在执行下一个测试方法之前,您需要等待上一个测试方法返回的承诺得以实现。
test(item: any, i: number){
this.filePath = item.rows.item(i).filepath;
this.fileName = this.filePath.substr(this.filePath.lastIndexOf('/') + 1);
this.imgePath = this.filePath.replace(this.fileName, "");
console.log(this.filePath)
console.log(this.fileName)
console.log(this.imgePath)
const one = new Promise<boolean>(resolve => {
this.readfile.checkFile(this.imgePath, this.fileName).then(isExists => {
console.log("one")
resolve(isExists);
})
});
const two = one.then(isExists => {
console.log("two")
if (isExists) {
return this.readfile.readAsDataURL(this.imgePath, this.fileName).then(res =>{
return res;
})
}
else {
console.log("not exists")
}
})
const three = two.then(res => {
console.log("three")
this.base64Image.push(res);
})
return three;
}
process(item: any, rows: number) {
let prom = Promise.resolve();
for (let i = 0; i < rows; i++) {
prom = prom.then(() => this.test(item,j));
console.log(i,"loop")
}
}