【问题标题】:async/await and promise.all in nodejsasync/await 和 promise.all 在 nodejs 中
【发布时间】:2022-11-23 06:48:04
【问题描述】:

我对 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 函数:

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]);
        });
      });

例如输出是:

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

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

谢谢

【问题讨论】:

    标签: javascript node.js async-await promise concurrency


    【解决方案1】:

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

    它不应该是这样的吗?:

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

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

    【讨论】:

    • 感谢您的回答,但这不起作用,结果我只是 undefined 。
    • 如果你得到 undefined 那么这实际上是进步 - 你得到 undefined 因为 console.log() 在调用 calc() 之前发生。我知道你有 await Promise...,但我认为仍然存在一些同步/异步愚蠢行为。但你肯定需要那些波浪形的括号。尝试 {await calc(route, amount)}) 看看是否有帮助...否则重写该部分以使用 .then,并将 console.log 放在 Promise 之后的 .then 中
    • 讨厌这里的 cmets,全部内联并使代码难以阅读!我想我实际上应该编辑我的答案,但在您确认它有效之前我不想这样做。你可以试试await Promise.all(...).then((result_routes) =&gt; {console.log(result_routes)});
    • 哦,你没有从 lambda 函数返回一个值,比如 =&gt; {return calc(route, amount_start)})
    • 在尝试了所有建议后,我确​​实遇到了同样的问题(我在几条路线上得到了相同的输出。
    猜你喜欢
    • 2018-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    • 1970-01-01
    • 2019-02-17
    • 2018-03-25
    • 1970-01-01
    相关资源
    最近更新 更多