从异步请求返回承诺的最佳方式?



我正在尝试在TypeScript中编写一个异步函数,它使用axios发出HTTP请求并返回请求数据的承诺。

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,或者我可以删除它并在thencatch块内返回?此外,我需要catch块来返回一个虚拟的AbstractionPreview,这一事实似乎非常不优雅。

通常,您不会将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" };
}
}

没有"right"介于这两者之间。这完全取决于你个人的喜好。当我想对多个异步操作进行排序时,我倾向于选择await,因为它比链式.then()处理程序更容易阅读。如果只有一个异步操作,那么哪种方式更简单,取决于个人偏好。

注意,我总是记录我正在消耗/隐藏的错误。否则,您的系统中可能会出现问题,您的代码正在"吃"。错误,你真的不知道是什么出了问题。

注:我不是一个TypeScript的人,所以如果我不小心犯了TypeScript的语法错误,请随时纠正它。

。似乎在这两种情况下,我们都在等待异步调用履行其承诺(在第一个示例中等待,然后在第二个示例中等待),然后返回。那么异步调用的目的是什么呢?它们看起来像同步调用,因为我们总是在返回之前等待它们完成。

在这两种情况下,这个函数立即返回一个promise(只要异步axios()调用开始)。这允许调用者在进行这些操作时做其他事情。然后,当异步操作完成时,这些函数可以处理结果并设置原始承诺的解析值,以便调用者可以获得最终结果的通知。

这不是同步代码。当异步操作正在进行时,Nodejs和调用者可以做其他事情或处理其他事件。这是非阻塞和异步的。await允许您编写可能"看起来"的代码。像同步代码一样,但是async函数在函数中的第一个await点返回一个承诺,然后调用者得到该承诺并可以做其他事情或nodejs可以处理其他事件。

是否有可能返回未完成的承诺?

是的,这两个选项已经返回一个未实现的承诺。当你返回一个承诺时,这几乎总是你在做的。