Web3js

Web3 讓 NodeJS 等到承諾在訂閱中得到解決?

  • May 9, 2022

我有以下程式碼:

import Web3 from 'web3';

function waitForFunds() {
   let web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:7545'));
   return new Promise((resolve, reject) => {
       web3.eth.subscribe('pendingTransactions').on("data", resolve);
   });
};

(async function () {
   await waitForFunds();
   console.log('Waiting');
})();

我希望 nodeJS 一直等到 waitForFunds() 返回的承諾得到解決,但相反,NodeJS 只是立即退出,而不是等待訂閱在接收數據時解決承諾。控制台從不記錄“等待”。我做錯什麼了嗎?

為了訂閱事件,您需要一個 Websocket 端點。這是您更新為使用 WSS 的程式碼:

var Web3 = require('web3')

async function waitForFunds() {
 let web3 = new Web3(
   new Web3.providers.WebsocketProvider(
     'wss://your-websocket-endpoint/12345'
   )
 )
 return new Promise((resolve, reject) => {
   web3.eth.subscribe('pendingTransactions').on('data', resolve)
 })
}

waitForFunds()
console.log('Waiting')

此外,如果您想列出待處理的交易,您可以使用以下內容:

var Web3 = require('web3')

const main = async () => {
 var web3 = new Web3(
   new Web3.providers.WebsocketProvider(
     'wss://your-websocket-endpoint/12345'
   )
 )

 var subscription = web3.eth
   .subscribe('pendingTransactions', async (error, result) => {
     if (error) console.log('error', error)
   })
   .on('data', async (transaction) => {
     console.log('TRX >>', transaction)
     const trxDetails = await web3.eth.getTransaction(transaction)
     console.log('trxDetails', trxDetails)
   })

}

main()

您可以使用Chainstack獲取多個區塊鏈協議的 HTTP 和 WSS 端點。

我認為你的函式waitForFunds應該是非同步的,以便等待 Promise 解決:async function waitForFunds() {}

引用自:https://ethereum.stackexchange.com/questions/127774