等待承诺链有什么问题?

时间:2019-01-27 06:37:33

标签: javascript promise async-await anti-patterns

我正在开发Angular 6应用程序,并且被告知以下内容是反模式:

await someFunction().then(result => {
    console.log(result);
});

我意识到等待承诺链毫无意义。如果someFunction()返回Promise,则在等待时不需要Promise链。您可以这样做:

const result = await someFunction();
console.log(result);

但是有人告诉我,等待诺言链可能会导致错误,或者会破坏代码中的内容。如果上面的第一个代码段与第二个代码段执行相同的操作,那么使用哪个代码段有什么关系呢。第一个摘要介绍第二个摘要没有带来什么危险?

3 个答案:

答案 0 :(得分:3)

在后台,异步/等待只是承诺。

也就是说,当您有一些类似于以下代码的代码:

const result = await myAsyncFunction();   
console.log(result): 

与写作完全相同:

myAsyncFunction().then(data => {
   const result = data; 
   console.log(result); 
}); 

当时的原因-您不应该混合使用async / await和.then链-是因为它令人困惑。

最好只选择一种样式并坚持下去。

在选择一个时-您最好也选择异步/等待-这更容易理解。

答案 1 :(得分:3)

  

有人告诉我,等待诺言链将破坏代码中的内容。

不一定,您的两个代码段确实确实工作相同(只要use App\Product;确实返回了承诺)。

  

使用哪一个有什么关系。第一个摘要介绍第二个摘要没有带来什么危险?

难以理解和维护,混合使用不同样式会造成混淆。混乱导致错误。

考虑到您将需要在someFunction()调用的位置添加另一个promise调用,甚至需要从该函数有条件返回。您是否可以像函数中其他地方一样在回调中使用console.log(),是否需要从await回调中获取return的结果,甚至有可能从外部访问then功能?所有这些问题甚至都不会出现在第一个片段中。虽然可以很容易地为您的玩具示例回答这些问题,但在实际代码中却没有那么简单,因为它具有更复杂和嵌套的控制流。

因此,您应该选择更简洁明了的产品。坚持使用return以获得一致性,避免在await s 1 中使用then

1:当然,规则总是有例外。我想说的是,在某些情况下,如果您使用async function或第二个catch回调,则可以更use promise chaining for error handling

答案 2 :(得分:-1)

如果您的then代码返回了promise而不是调用console.log,则第一个示例将为await,但第二个示例将不会。

使用async/await时,您将在try/catch块中捕获拒绝。您的代码将更少嵌套且更清晰。

使用then通常会导致更多的嵌套,并且更难以阅读代码。

您可以await进行任何操作,无论它是否返回promise。有时,这种面向未来的方法调用的方法可能有一天会成为异步方法,或者只是在不声明异步的情况下返回承诺。

缺点是复杂性,性能和兼容性,与收益相比,所有这些都显得微不足道。

我发现,如果您在调用某个函数后依赖它的返回值,并且它最终可能成为异步的,则可以用await装饰调用您的函数,无论是当前异步还是当前异步调用,返回承诺。