我正在定义一个需要异步函数作为参数的函数:
async function handle(def: Promise<string>) {
// ...
const data = await def;
console.log(`data equals: ${data}`)
}
我可以通过一个承诺成功地执行这一点。
handle(new Promise(async (res, rej) => {
const data = await Promise.resolve("some data")
if (data == "invalid")
return rej("data is invalid")
res(data)
}))
我需要内部函数是异步的,因为我需要在内部执行等待。然而,我不喜欢承诺中的异步,并在网上读到它被认为是一种反模式。
我认为最好去掉promise,使用一个基本的异步函数:
handle(async () => {
const data = await Promise.resolve("some data")
if (data == "invalid")
throw "data is invalid"
return data
})
但TS编译器引发了错误:
Argument of type '() => Promise<string>' is not assignable to parameter of type 'Promise<string>'. ts(2345)
我认为Promise和异步函数在某种程度上是可交换的。我读到异步函数总是返回一个promise。很明显,我没有正确解释这一点,但我不确定错误告诉了我什么。
我希望我画的问题是清楚的。如果有人能澄清错误或就如何以期望的方式实现这一点提出建议,我们将不胜感激。非常感谢!
您的函数签名似乎不正确。您将参数定义为Promise<string>
,而您确实希望它是() => Promise<string>
。
async function handle(def: () => Promise<string>) {
// ...
const data = await def();
console.log(`data equals: ${data}`)
}
通常,当您调用想要promisify的基于回调的函数时,在这种情况下使用Promise构造函数的时机是合适的。但在这里,看起来并没有什么可Promise的,所以Promise构造函数并没有真正的帮助。
如果
我需要内部函数是异步的,因为我需要在内部执行等待。
您可以立即调用异步IIFE-是的,对Promise构造函数使用异步回调是不安全的,因为它无法处理错误。
handle((async () => {
const data = await Promise.resolve("some data")
if (data == "invalid")
throw "data is invalid";
return data
})())
另一种选择是使用.then
-.then
在许多情况下可以与await
互换:
handle(
Promise.resolve("some data")
.then((data) => {
if (data == "invalid")
throw "data is invalid";
return data;
})
);