以下功能:
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),过滤器循环似乎是在之后处理的。我猜这是一个异步/等待问题。我如何保持过滤器同步?
2条答案
按热度按时间vojdkbi01#
不能将
async
函数用作filter
回调函数,因为:filter
不会等待承诺得到解决,并且async
函数总是返回promises,而promises就像所有非null
对象一样都是真实的,因此就filter
而言,您返回的是一个标志,表示您应该保留该元素在这种情况下,可以使用
Promise.all
等待检索所有事务,然后筛选结果;参见注解:对
web3.eth.getTransaction
的所有调用都将并行启动,然后我们等待所有调用通过await Promise.all(/*...*/)
完成,然后过滤结果并返回。yjghlzjz2#
下面的解决方案使用iter-ops库,该库支持异步
filter
:函数
getPendingTransactions
将返回AsyncIterable<Transaction>
,您可以轻松地循环执行该函数: