等待承诺链有什么问题?

Gib*_*hah 5 javascript anti-patterns promise async-await

我正在研究一个Angular 6应用程序,我被告知以下是一个反模式:

await someFunction().then(result => {
    console.log(result);
});
Run Code Online (Sandbox Code Playgroud)

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

const result = await someFunction();
console.log(result);
Run Code Online (Sandbox Code Playgroud)

但我被告知等待一个承诺链可能会导致错误,或者它会破坏我的代码中的东西.如果上面的第一个代码片段与第二个代码段完全相同,那么使用哪个代码片段至关重要.第一个片段引入了哪个危险,第二个片段没有?

Ber*_*rgi 10

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

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

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

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

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

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

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


dwj*_*ton 6

在幕后,async/await 只是承诺。

也就是说,当你有一些看起来像这样的代码时:

const result = await myAsyncFunction();   
console.log(result): 
Run Code Online (Sandbox Code Playgroud)

这与编写完全相同:

myAsyncFunction().then(data => {
   const result = data; 
   console.log(result); 
}); 
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • `更容易理解` 那是100% 的意见。我发现很难向某些人解释一个 `async` 函数实际上在第一个 `await` 表达式时返回给调用者。在我看来,Promise 本身的学习曲线比 `async` / `await` 少。 (5认同)