类型为'()=>承诺<字符串>'不可分配给类型为'承诺<字符串>



我正在定义一个需要异步函数作为参数的函数:

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;
})
);

相关内容