如何简化TypeScript中异步Iterable场景下的冗余异步代码?
简化异步验证对象可查询性的冗余代码
你编写了一段用于验证对象是否可查询的冗余代码,希望对其进行简化,同时疑惑TypeScript中是否存在更简洁的写法(你认为不存在异步Iterable)。
原冗余代码
const quoterContract = getQuoterContract(quoterAddress, QuoterABI, provider); const quotePromises = poolData.map(data => { const dataEnclosure = data; const quote = getQuotedPrice(quoterContract, tradeAmount, data.token0, data.token1, data.feeAmount ?? 0) .then(r =>{ dataEnclosure.isQuotable = true; return dataEnclosure; }) .catch(err => { dataEnclosure.isQuotable = false return dataEnclosure; }); return quote; }) const quoteData = await Promise.all(quotePromises) quoteData.forEach(d => { console.log(` ${d.name} is quotable ${d.isQuotable}`); }); //Function pseudo code for clarification const getQuotedPrice = async (a,b,c,d) => {...}
简化方案
方案1:直接修改原对象(高效简洁)
利用async/await替代链式调用,去掉多余中间变量,让逻辑更线性直观:
const quoterContract = getQuoterContract(quoterAddress, QuoterABI, provider); // 合并Promise创建与等待,减少冗余变量 const quoteData = await Promise.all(poolData.map(async (data) => { try { await getQuotedPrice(quoterContract, tradeAmount, data.token0, data.token1, data.feeAmount ?? 0); data.isQuotable = true; } catch { data.isQuotable = false; } return data; })); quoteData.forEach(d => console.log(` ${d.name} is quotable ${d.isQuotable}`)); // 伪代码 const getQuotedPrice = async (a,b,c,d,e) => {...}
方案2:返回新对象(不修改原数据)
如果希望保留原poolData的纯净性,可通过扩展运算符创建新对象:
const quoterContract = getQuoterContract(quoterAddress, QuoterABI, provider); const quoteData = await Promise.all(poolData.map(async (data) => { const isQuotable = await getQuotedPrice(quoterContract, tradeAmount, data.token0, data.token1, data.feeAmount ?? 0) .then(() => true) .catch(() => false); return {...data, isQuotable}; })); quoteData.forEach(d => console.log(` ${d.name} is quotable ${d.isQuotable}`));
关于异步Iterable的补充
TypeScript支持异步迭代器(如for-await-of),但在这个场景下Promise.all是更优选择——它能并行执行所有异步请求,效率远高于串行的异步迭代器。只有当你需要限制并发数或必须串行处理时,才适合使用异步迭代器。
内容的提问来源于stack exchange,提问作者Ritzy Dev
相关产品推荐
相关产品推荐

