This question already has an answer here:
avoiding nested callbacks with promises
                                
                                    (1个答案)
                                
                        
                去年关闭。
            
        

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

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

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来创建请求
然后,我请求更新销售清单中的商品
然后,如果该项目的两列具有特定值,我会再次请求更新销售

最佳答案

正如您在编辑中提到的那样,链接您的诺言是解决嵌套诺言的经典方法。实际上,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

关于javascript - 如何防止可能的嵌套 promise ? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54833830/

10-16 21:55