如何防止可能的嵌套承诺?

时间:2019-02-22 19:23:51

标签: javascript promise ionic3

[未复制] 问题不同,但是我的问题在下面得到了解答

我正在创建一个离子项目,在该项目中我必须做很多承诺,然后可能有一些这样的承诺

this.Promise1()
    .then((data) => {
        if(logicTest){
            return this.Promise2()
                .then((data) => {
                    // ...
                })
                .catch(error => {
                    // Present error message to the user
                });    
        }

        // ...
    })
    .catch(error => {
        // Present error message to the user
    })

我看到了一个示例,它像下面这样

this.Promise1()
    .then(() => { ... })
    .then(() => { ... })

但是在我的示例中,有时它没有返回承诺并且我需要抓住不同的错误呢?

我何时做出这些嵌套的承诺?

  • 从存储中获取用户以获取API_TOKEN来创建请求
  • 然后我请求更新销售清单中的商品
  • 然后,如果该项目的两列具有特定值,我会再次请求更新销售

1 个答案:

答案 0 :(得分:2)

正如您在编辑中提到的那样,链接诺言是解决嵌套诺言的经典方法。实际上,Promise API的主要目的之一就是为"callback hell"提供解决方案。

如果您想更进一步,也可以使用async / await。关于先前删除的async / await兼容性问题,Ionic基于配置的兼容性目标使用TypeScript和TypeScript转码代码。这意味着您应该能够使用async / await来简化嵌套或链接的承诺,而不会出现问题。

例如:

async myFunction() {
    try {
        const data = await this.Promise1();
        if (logicTest) {
            try {
                return await this.Promise2();
            }
            catch (error) {
                // Present error message to the user
            }
        }

        // ...
    }
    catch (error) {
        // Present error message to the user
    }
}

根据您的用例,您甚至可以使用async / await简化代码,以进一步防止过多的嵌套。

如果您确实决定使用async / await,则应确保阅读该功能的工作原理。滥用此功能可能导致比赛状况和其他难以诊断的意外行为。存在许多博客文章和教程,它们比我在这里可以更好地描述功能。快速的Google搜索弹出了该搜索,例如:https://javascript.info/async-await