Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/475.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有异步/等待的JavaScript数组过滤器_Javascript_Node.js_Arrays_Async Await - Fatal编程技术网

带有异步/等待的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(/*…*/)
    等待所有调用的解决,然后过滤结果并返回它