我正在嘗試在 TypeScript 中撰寫一個異步函式,該函式使用 axios 發出 HTTP 請求并為請求的資料回傳一個 Promise。
export async function loadSingleArweaveAbstraction(absId : string) : Promise<AbstractionPreview> {
let abstractionPreview : AbstractionPreview = await axios({
method: 'get',
url: ARWEAVE_URL absId,
responseType: 'json'
}).then(function(response) {
return {
name: response.data.name,
imageUri: response.data.image,
symbol: response.data.symbol,
};
}).catch(function(v) {
return { name: "Null", imageUri: "null", symbol: "null" };
});
return abstractionPreview;
}
我不確定這是否是從異步呼叫回傳回應的最佳方式。我必須使用 await 還是可以將其洗掉并在thenandcatch塊內回傳?此外,我需要 catch 塊來回傳一個假人這一事實AbstractionPreview似乎很不雅。
uj5u.com熱心網友回復:
await通常,您不會.then()在同一個功能中混合使用 - 而是為特定功能選擇一種風格或另一種風格。雖然您顯示的代碼可以正常作業,但這是兩種更一致的撰寫方式:
沒有async/await:
export function loadSingleArweaveAbstraction(absId : string) : Promise<AbstractionPreview> {
return axios({
method: 'get',
url: ARWEAVE_URL absId,
responseType: 'json'
}).then(function(response) {
return {
name: response.data.name,
imageUri: response.data.image,
symbol: response.data.symbol,
};
}).catch(function(e) {
console.log(e);
return { name: "Null", imageUri: "null", symbol: "null" };
});
}
使用async/await:
export async function loadSingleArweaveAbstraction(absId: string): Promise <AbstractionPreview> {
try {
let response: AbstractionPreview = await axios({
method: 'get',
url: ARWEAVE_URL absId,
responseType: 'json'
});
return {
name: response.data.name,
imageUri: response.data.image,
symbol: response.data.symbol,
};
} catch (e) {
console.log(e);
return { name: "Null", imageUri: "null", symbol: "null" };
}
}
這兩者之間沒有“正確”的方式。這真的取決于你自己的個人喜好。await當我有多個要排序的異步操作時,我傾向于更喜歡,因為它只是比鏈式.then()處理程式更容易閱讀的代碼。只有一個異步操作,它更像是一種洗滌方式,哪種方式更簡單,取決于個人喜好。
請注意,我總是記錄我正在使用/隱藏的錯誤。否則,您的系統可能會出現問題,您的代碼正在“吃掉”錯誤,而您最終真的不知道出了什么問題。
PS 我不是 TypeScript 人,所以如果我不小心犯了 TypeScript 語法錯誤,請隨時糾正。
. 似乎在這兩種情況下,我們都在等待我們的異步呼叫來實作它的承諾(在第一個示例中等待,然后在第二個示例中)然后回傳。那么異步呼叫的目的是什么?它們看起來像同步呼叫,因為我們總是在回傳之前等待它們完成?
在這兩種情況下,此函式都會立即回傳一個 Promise(異步axios()呼叫一開始)。這允許呼叫者在這些操作正在進行時做其他事情。然后,當異步操作完成時,這些函式可以處理結果并設定原始承諾的決議值,以便呼叫者可以得到最終結果的通知。
這不是同步代碼。在此異步操作進行時,Nodejs 和呼叫者能夠做其他事情或處理其他事件。這是非阻塞和異步的。 await允許您撰寫可能“看起來”像同步代碼的代碼,但是async函式在函式中的第一個點回傳一個承諾,await然后呼叫者獲得該承諾并可以做其他事情,或者 nodejs 可以處理其他事件。
是否有可能退回未兌現的承諾?
是的,這兩個選項都已經回傳了一個未實作的承諾。當你回傳一個承諾時,這幾乎總是你正在做的事情。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/498334.html
