我正在定義一個需要異步函式作為引數的函式:
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 中的 async 并在線閱讀它被認為是一種反模式。
我認為擺脫承諾并使用基本的異步函式是一個更好的主意:
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)
我認為 Promises 和 async 函式在某種程度上是可以互換的。我讀到 async 函式總是回傳一個 promise。顯然我沒有正確解釋這一點,但我不確定錯誤告訴我什么。
我希望我正在勾畫的問題很清楚。如果有人可以澄清錯誤或就如何以所需的方式實作此問題提供建議,將不勝感激。十分感謝!
uj5u.com熱心網友回復:
您的函式簽名似乎不正確。您將引數定義為 a Promise<string>,而您確實愿意將其定義為() => Promise<string>。
async function handle(def: () => Promise<string>) {
// ...
const data = await def();
console.log(`data equals: ${data}`)
}
uj5u.com熱心網友回復:
一般來說,在這種情況下使用 Promise 建構式的時候是正確的,當你呼叫一個你想要 Promisify 的基于回呼的函式時。但是在這里,看起來沒有什么可以承諾的,所以 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;
})
);
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/432440.html
