【问题标题】:synchronus for loop with promises and multiple functions [duplicate]具有承诺和多个功能的同步for循环[重复]
【发布时间】:2018-08-23 12:51:50
【问题描述】:

基本概述。

我有一个数据集,我想用 for 语句循环。

在两个函数都完成之前,我不想继续执行 for 循环中的下一项。函数 1 依赖于函数 2 的成功,如果其中一个失败,我希望循环停止。

这是我的两个函数。

submitEntryPromise(entry): Promise < any > {
    return new Promise((resolve, reject) => {
        this.submitEntry(entry).take(1).subscribe(data => {
            if (data) {
                resolve(data);
            }
        }, (error: any) => {
            console.log('rejected submitEntry' + JSON.stringify(error));
            reject(false);
        });
    });
}
deleteEntryFromSqlLitePromise(rowid): Promise < any > {
    return new Promise((resolve, reject) => {
        this.deleteEntry(rowid).then(res => {
            if (res) {
                resolve(res);
            } else {
                reject(false);
            }
        }).catch((error: any) => {
            console.log('reject delete' + JSON.stringify(error));
            reject(false);
        });
    });
}

我的数据集(从 sql lite local db 返回) 被命名为 savedEntries

我正在尝试这样的事情。

  for (let i = 0, p = Promise.resolve(); i < savedEntries.rows.length; i++) {
    p = p.then(_ => this.wpservice.submitEntryPromise(
        { 
          score: savedEntries.rows.item(i).score, 
          email: savedEntries.rows.item(i).email
        }))
  }

但我不确定在哪里调用我的 deleteEntryFromSqlLitePromise 函数,我不确定这些函数是否会按顺序执行?

基本上我在离线 sql db 中循环保存条目,并将它们同步到我的服务器,当服务器说它收到我想从本地数据库中删除它的条目时。

任何建议都将不胜感激,我正在为我的离子项目编写打字稿。

【问题讨论】:

  • 你应该看看async/await,它使这样的代码更易于阅读和编写。
  • Duannx,非常相似,我的主要斗争是确保在进入循环的下一部分之前触发这两个项目,我使用承诺链到达了某个地方,但我希望像 Titian 建议的那样使用 async/await ,看起来代码看起来更干净。将发布我发现的矮个子。

标签: typescript ionic3


【解决方案1】:

由于您使用的是 Typescript,您应该考虑 async/await 它允许您以同步的方式编写异步代码:

async deleteEntryFromSqlLitePromise(rowid): Promise<any> {
    try {
        let res = await this.deleteEntry(rowid);
        return res || false;
    } catch (error) {
        console.log('reject delete' + JSON.stringify(error));
        return false;
    }
}

async deleteAll(savedEntries: { rows: { length: number, item(i: number): any } }) {
    let rows = savedEntries.rows;
    for (let i = 0; i < rows.length; i++) {
        try {
            let synced = await this.wpservice.submitEntryPromise(
                {
                    score: rows.item(i).score,
                    email: rows.item(i).email
                });
            if (synced) {
                let deleted = await this.wpservice.deleteEntryFromSqlLitePromise(rows.item(i).rowid)
                if (!deleted) {
                    // decide whta to do if not deleted
                }
            } else {
                // decide what to do if not synced
            }
        } catch (e) {
            // Decide what to do with any errors
        }
    }
}

【讨论】:

  • 感谢泰坦!我会看看并报告。
猜你喜欢
  • 1970-01-01
  • 2017-10-22
  • 1970-01-01
  • 1970-01-01
  • 2017-10-17
  • 1970-01-01
  • 2014-03-20
  • 2020-11-24
相关资源
最近更新 更多