繁体   English   中英

async/await 和 promise.all 在 nodejs 中

[英]async/await and promise.all in nodejs

我对 node.js 中的 async/await 和 promise.all 有疑问:

我写了一个机器人来检查去中心化交易所的价格,比如 quickswap、sushiswap 和 uniswap。 因此,我确实有一个 js 文件,其中包含要检查的路由。 它看起来像这样:

const routes = [
  [
    //1.1
    "quick / sushi - 2x2",
    token_Address_wmatic,
    token_Address_usdc,
    token_Address_weth,
    token_Address_usdt,
    token_Address_wmatic,
    "WMATIC - USDC - WETH - USDT - WMATIC",
  ],
  [
    //1.2
    "sushi / quick - 2x2",
    token_Address_wmatic,
    token_Address_usdt,
    token_Address_weth,
    token_Address_usdc,
    token_Address_wmatic,
    "WMATIC - USDT - WETH - USDC - WMATIC",
  ],
  [
    //2.1
    "quick / sushi - 1x1",
    token_Address_wmatic,
    token_Address_weth,
    token_Address_wmatic,
    "-",
    "-",
    "WMATIC - WETH - WMATIC",
  ],
  [
    //2.2
    "sushi / quick - 1x1",
    token_Address_wmatic,
    token_Address_weth,
    token_Address_wmatic,
    "-",
    "-",
    "WMATIC - WETH - WMATIC",
   ],  
 ];
    
 module.exports = routes;

我在我的主 node.js 文件中使用这条路线:

async function calc(route, amount_wei) {
  try {
    switch (route[0]) {
      case "quick / sushi - 2x2":
        amountOut = await quotes_5(
          quickswap_router,
          sushiswap_router,
          route,
          amount_wei
        );
        break;
      case "sushi / quick - 2x2":
        amountOut = await quotes_5(
          sushiswap_router,
          quickswap_router,
          route,
          amount_wei
        );
        break;
      case "quick / sushi - 1x1":
        amountOut = await quotes_2(
          quickswap_router,
          sushiswap_router,
          route,
          amount_wei
        );
        break;

      case "sushi / quick - 1x1":
        amountOut = await quotes_2(
          sushiswap_router,
          quickswap_router,
          route,
          amount_wei
        );
        break;
    }
  } catch (err) {
    var amountOut = [0, 0, 0, 0, 0, 0];
  }
  return amountOut;
   }

我这样调用 calc function:

const result_routes = await Promise.all(
    routes.map(async (route) => calc(route, amount_start))
  );

console.log(result_routes);

但对于某些路线,结果完全相同。 应该是什么不正确。 我希望每条路线都能得到不同的结果。 您可以在结果数组中看到与下面的顺序示例中的值有很大不同。 结果:

{
    route: [
      'quick / sushi - 1x1',
      '0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270',
      '0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619',
      '0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270',
      '-',
      '-',
      'WMATIC - WETH - WMATIC'
    ],
    result: [
      '10000000000',
      '9099197560',
      '9558303845057372114568',
      0,
      0,
      9558.3
    ]
  },
  {
    route: [
      'sushi / quick - 1x1',
      '0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270',
      '0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619',
      '0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270',
      '-',
      '-',
      'WMATIC - WETH - WMATIC'
    ],
    result: [
      '10000000000',
      '9099197560',
      '9558303845057372114568',
      0,
      0,
      9558.3
    ]
  },

如果我像这样获取路线:

for (i = 0; i < routes.length; i++) {
  erg = await calc(routes[i], amount_start);
  console.log(erg);
}

每条路线我得到不同的结果。 结果:

route: [
    'quick / sushi - 1x1',
    '0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270',
    '0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619',
    '0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270',
    '-',
    '-',
    'WMATIC - WETH - WMATIC'
   ],
   result: [
    '10000000000000000000000',
    '7458279716470527164',
    '9858081993246032795263',
    0,
      0,
      9858.08
     ]
    },
    {
   route: [
    'sushi / quick - 1x1',
    '0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270',
    '0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619',
    '0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270',
    '-',
    '-',
    'WMATIC - WETH - WMATIC'
   ],
   result: [
    '10000000000000000000000',
    '7456852002788490479',
    '9860515589493070726861',
    0,
    0,
    9860.52
   ]
}

我的第一种方法有问题吗? 因为我想同时获取路线,但我想我错过了一些东西。 有人可以帮我解决这个问题吗?

谢谢!

我希望我的代码能够同时获取所有路由,但也可以分别获取。 目前看来,有些计算在计算过程中被覆盖了。


添加于 2022 年 11 月 22 日:我尝试了以下操作:

const result_routes = await Promise.all(
        routes.map(async (route) => {
          return await calc(route, amount_start);
        })
      ).then((result_routes) => {
        result_routes.forEach(function (res) {
          console.log(res.route[0], ": ", res.route[6], ": ", res.result[5]);
        });
      });

例如 Output 是:

quick / sushi - 2x2 :  WMATIC - USDC - WETH - USDT - WMATIC :  9066.37
sushi / quick - 2x2 :  WMATIC - USDT - WETH - USDC - WMATIC :  9066.37
quick / sushi - 1x1 :  WMATIC - WETH - WMATIC :  9369.05
sushi / quick - 1x1 :  WMATIC - WETH - WMATIC :  9369.05
quick / sushi - 2x1 :  WMATIC - DAI - USDC - WMATIC :  5427.25
sushi / quick - 1x2 :  WMATIC - USDC - DAI - WMATIC :  5440.61
quick / sushi - 2x2 :  WMATIC - USDC - DAI - USDC - WMATIC :  9066.37
sushi / quick - 2x2 :  WMATIC - USDC - DAI - USDC - WMATIC :  9066.37
quick / sushi - 2x2 :  WMATIC - USDC - TUSD - USDC - WMATIC :  9066.37
sushi / quick - 2x2 :  WMATIC - USDC - TUSD - USDC - WMATIC :  9066.37
quick / sushi - 1x1 :  WMATIC - USDC - WMATIC :  9369.05
sushi / quick - 1x1 :  WMATIC - USDC - WMATIC :  9369.05
quick / sushi - 1x1 :  USDC - DAI - USDC :  9369.05
sushi / quick - 1x1 :  USDC - DAI - USDC :  9369.05
quick / sushi - 1x1 :  USDC - WETH - USDC :  9369.05
sushi / quick - 1x1 :  USDC - WETH - USDC :  9369.05
quick / sushi - 1x1 :  USDC - TUSD - USDC :  9369.05
sushi / quick - 1x1 :  USDC - TUSD - USDC :  9369.05
quick / sushi - 2x2 :  USDC - WETH - WMATIC - WETH - USDC :  9066.37
sushi / quick - 2x2 :  USDC - WETH - WMATIC - WETH - USDC :  9066.37
quick / sushi - 2x2 :  USDC - QUICK - WMATIC - SUSHI - USDC :  9066.37
sushi / quick - 2x2 :  USDC - SUSHI - WMATIC - QUICK - USDC :  9066.37

所以很多路线都给出完全相同的 output,我认为这一定是错误的。 有人可以告诉我我在哪里做错了吗?

谢谢

我不确定你调用 calc function 的方式是否正确——它不是 function,所以 route 的值是未定义的,每次都会使用第一条路线。 基本上你错过了波浪形的括号。

它不应该是这样的吗?:

const result_routes = await Promise.all(
    routes.map(async (route) => {calc(route, amount_start)})
  );

console.log(result_routes);

THEN route 的值将正确传递给 calc。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM