[英]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.