You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何简化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 14:50:48