等待Promise链有什么问题?

IT技术 javascript promise async-await anti-patterns
2021-01-20 01:59:04

我正在开发一个 Angular 6 应用程序,有人告诉我以下是一个反模式:

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

我意识到等待Promise链毫无意义。如果 someFunction() 返回一个Promise,那么如果您正在等待它,则不需要Promise链。你可以这样做:

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

但是我被告知等待Promise链可能会导致错误,或者它会破坏我的代码。如果上面的第一个代码片段与第二个代码片段执行相同的操作,那么使用哪个代码片段有什么关系。第一个片段引入了第二个没有的危险?

3个回答

有人告诉我等待Promise链会破坏我的代码。

不一定,你的两个代码片段确实工作相同(只要someFunction()真的返回一个Promise)。

使用哪一个有什么关系。第一个片段引入了第二个没有的危险?

更难理解和维护,混合不同的风格很混乱。混乱会导致错误。

考虑到您需要在调用位置添加另一个 Promiseconsole.log()调用,甚至是函数的条件返回。您是否可以await像函数中的其他地方一样在回调中使用,是否需要returnthen回调中获得结果,甚至可以return从外部函数中获得结果?所有这些问题甚至都没有出现在第一个片段中。虽然对于您的玩具示例可以轻松回答这些问题,但在具有更复杂和嵌套控制流的实际代码中可能并不那么容易。

所以你应该更喜欢更简洁和干净的。棒以await用于一致性,避免thenasync function小号1

1:当然,规则总是有例外的。我会说在某些情况下使用 Promise 链接进行错误处理会更干净,您将使用它catch或第二个then回调。

在幕后,async/await 只是Promise。

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

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

这与编写完全相同:

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

那么原因 - 你不应该混合 async/await 和.then链 - 是因为它令人困惑。

最好只选择一种风格,并坚持下去。

当你选择一个时——你也可以选择 async/await——它更容易理解。

it's more understandable这是100%的意见。我发现很难向某些人解释async函数实际上在第一个await表达式时返回给调用者在我看来,Promise 本身的学习曲线比async/await
2021-03-19 01:59:04
实际上,我认为上面的第一个代码示例是错误的,因为没有顶级await调用..它应该包裹在某个async function()块中,否则awai无法执行,还是我错了?在我看来,这就是 async-await 的缺点......恕我直言,它有点开销......
2021-04-05 01:59:04

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

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

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

你可以做await任何事情,无论它是否返回promise. 有时,这种面向未来的方法调用可能有朝一日变为异步或仅返回Promise而不声明异步的方法。

缺点是复杂性、性能和兼容性,与收益相比,所有这些都相形见绌。

我发现,如果您在调用函数后依赖于它的返回值,并且它是或可能最终成为异步的,请用await您的心满意足地装饰调用您的函数,无论它是当前异步还是返回一个Promise。

So decorate your code with await to your heart's delight!似乎很像暗示在不必要时使用它,尤其是当与您之前的断言相结合时,您可以做await任何事情。那么,我应该var foo = await "bar";仅仅因为它有效吗?也许有一天我会把那个字符串改成一个Promise?同时,我不得不把它放在一个async函数中,因为我想把一个随机的await表达式在“面向未来”的东西上。是的,我很可笑,但是当我阅读您回答末尾的陈述时,这对我来说仍然像是讽刺。
2021-03-14 01:59:04
foo() 是同步的,但可能有一天会变成异步的” - 这不是使用的好理由await,把它当作今天已经是异步的了。函数是否异步是其 API 契约的重要组成部分,不得随意更改。记录你正在做的事情并坚持下去。
2021-03-16 01:59:04
就在这里。如果函数返回定义函数的对象then(),则awaitinging完全不同return这确实是有害的,并且是不兼容的行为。
2021-03-28 01:59:04
我看不出这是多么讽刺。你是那些async/await仇恨者中的一员吗?我已经教过数百名学生使用它们,然后再也不回去了。
2021-03-29 01:59:04
为了解释引入错误的场景,+1。对于以不好的(不知道是否讽刺?)建议结束,-1。
2021-04-02 01:59:04