带有异步/等待的JavaScript数组过滤器
以下功能:带有异步/等待的JavaScript数组过滤器,javascript,node.js,arrays,async-await,Javascript,Node.js,Arrays,Async Await,以下功能: 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
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),并且过滤器循环似乎在之后处理。我想这是一个异步/等待问题。
如何使筛选器保持同步?您不能将
异步
函数用作筛选器
回调,因为:
filter
不会等待承诺兑现,并且
async
函数总是返回承诺,像所有非null
对象这样的承诺都是真实的,因此就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
的所有调用都将并行启动,然后我们通过wait Promise.All(/*…*/)
等待所有调用的解决,然后过滤结果并返回它