循环内的承诺链

时间:2018-09-25 14:57:31

标签: javascript angular ionic-framework

我是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个小时,但仍然无法解决。谢谢!

1 个答案:

答案 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")
    }
}