将 Promise 作为函数参数传递被认为是一种不好的做法吗?
Is passing a Promise as a function argument considered a bad practise?
我经常问自己这个问题,因为它会导致明显的问题:
function someFunction (a, b) {
return a + b
}
如果 a
是一个承诺,您需要先解决它:
async function someFunction (a, b) {
a = await a
return a + b
}
导致混淆a
是否已解决...
是的,通常应该避免将承诺传递给函数。更喜欢等待承诺并只传递结果,即 do
somethingAsync().then(x => someFunction(x, y))
// or
someFunction(await somethingAsync(), y)
而不是
someFunction(somethingAsync(), y)
正如您所说,否则会让人非常困惑,尤其是当您搞砸时不使用 TypeScript 来告诉您。而且 someFunction
的实现在同步的时候变得简单很多,不需要处理任何异步逻辑,这也使得它更加通用。
当然,每个规则都有例外,它们将是明确专用于处理异步承诺逻辑的函数,例如 Promise.resolve
、Promise.all
、Promise.race
、.then()
等。有时您自己编写类似的辅助函数,例如用于错误处理,在这些情况下,传递承诺可能是可以接受的。不过还是不一般。
我经常问自己这个问题,因为它会导致明显的问题:
function someFunction (a, b) {
return a + b
}
如果 a
是一个承诺,您需要先解决它:
async function someFunction (a, b) {
a = await a
return a + b
}
导致混淆a
是否已解决...
是的,通常应该避免将承诺传递给函数。更喜欢等待承诺并只传递结果,即 do
somethingAsync().then(x => someFunction(x, y))
// or
someFunction(await somethingAsync(), y)
而不是
someFunction(somethingAsync(), y)
正如您所说,否则会让人非常困惑,尤其是当您搞砸时不使用 TypeScript 来告诉您。而且 someFunction
的实现在同步的时候变得简单很多,不需要处理任何异步逻辑,这也使得它更加通用。
当然,每个规则都有例外,它们将是明确专用于处理异步承诺逻辑的函数,例如 Promise.resolve
、Promise.all
、Promise.race
、.then()
等。有时您自己编写类似的辅助函数,例如用于错误处理,在这些情况下,传递承诺可能是可以接受的。不过还是不一般。