我正在开发Angular 6应用程序,并且被告知以下内容是反模式:
await someFunction().then(result => {
console.log(result);
});
我意识到等待承诺链毫无意义。如果someFunction()返回Promise,则在等待时不需要Promise链。您可以这样做:
const result = await someFunction();
console.log(result);
但是有人告诉我,等待诺言链可能会导致错误,或者会破坏代码中的内容。如果上面的第一个代码段与第二个代码段执行相同的操作,那么使用哪个代码段有什么关系呢。第一个摘要介绍第二个摘要没有带来什么危险?
答案 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
装饰调用您的函数,无论是当前异步还是当前异步调用,返回承诺。