将 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.resolvePromise.allPromise.race.then() 等。有时您自己编写类似的辅助函数,例如用于错误处理,在这些情况下,传递承诺可能是可以接受的。不过还是不一般。