gpt4 book ai didi

带有 async/await 的 JavaScript 数组过滤器

转载 作者:行者123 更新时间:2023-12-05 00:44:22 25 4
gpt4 key购买 nike

如下函数:

async function getPendingTransactions(address){
var pendingBlock = await web3.eth.getBlock('pending');
var i = 0;
var pendingTransactions = await pendingBlock.transactions.filter(async function(txHash) {
var tx = await web3.eth.getTransaction(txHash);
console.log(tx);
if(tx != null) {
return tx.from==address && tx.to == CONTRACT_ADDRESS;
}
});
console.log(pendingTransactions);
return pendingTransactions;
}

过滤器不起作用并显示所有事务(console.log),并且过滤器循环似乎在之后处理。我想这是一个异步/等待问题。如何保持过滤器同步?

最佳答案

您不能将 async 函数用作 filter 回调,因为:

  1. filter 不会等待 promise 完成,并且

  2. async 函数总是返回 Promise,并且所有非 null 对象的 Promise 都是真实的,就 filter 而言担心你会返回一个标志,说你应该保留该元素

这种情况下,你可以使用Promise.all等待所有的事务被取回,然后过滤结果;见评论:

async function getPendingTransactions(address) {
const pendingBlock = await web3.eth.getBlock("pending");
// *** Get the transactions by creating an array of promises and then waiting
// via `await` for all of them to settle
const transactions = await Promise.all(
pendingBlock.transactions.map(txHash => web3.eth.getTransaction(txHash))
);
// *** Filter them
const pendingTransactions = transactions.filter(
tx => tx && tx.from == address && tx.to == CONTRACT_ADDRESS
);
return pendingTransactions;
}

所有对 web3.eth.getTransaction 的调用都将并行启动,然后我们等待所有调用通过 await Promise.all(/*...*/),然后过滤结果返回。

关于带有 async/await 的 JavaScript 数组过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67166932/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com