Web3.js: ¿cómo cargar y mostrar de manera eficiente un montón de elementos de Blockchain?

Estoy desarrollando una DApp y estoy luchando con la carga eficiente de la cadena de bloques y la visualización en la interfaz. Estoy cargando todos los elementos a la vez. Cuando la lista de elementos crece mucho (> 500), la interfaz comienza a retrasarse y la carga es un poco lenta (recibo advertencias como "[Violación] Reflujo forzado mientras se ejecutaba JavaScript tardó 87 ms"). La página tiene una paginación y clasificadores/filtros, por lo que no puedo cargar elementos parcialmente (por índice), ya que no sé cuántos necesitaré cuando se apliquen los filtros/clasificadores.

Aquí está el pseudocódigo: Solidez:

struct Item {
  uint256 id;
  address owner;
  bool claimed;
}

Item[] private items;
uint256 public numberOfItems;

function getItemInfo(uint256 itemID) public view returns(address owner, bool claimed) {
  Item memory item = items[itemID];

  owner = item.owner;
  claimed = item.claimed;
}

JS (web3):

loadItems: function(items, account) {
  var contractInstance;

  App.contracts.MyContract.deployed().then(function(instance) {
    contractInstance = instance;
    return contractInstance.numberOfItems.call();
}).then(function(numberOfItems) {
  console.log(Number(numberOfItems));

  for (var i = 0; i < numberOfItems; i++ ){
  contractInstance.getItemInfo(i).then(function(data){
    //console.log(data);
  })
}
}).catch(function(err) {
  console.log(err.message);
});
},

Sería genial recibir sugerencias sobre cómo puedo resolver este problema y cargar elementos de manera eficiente.

Respuestas (1)

Para asegurarse de que las cosas se carguen, debe usar promesas. Esto asegurará que nada se arruine porque se agotó el tiempo de espera. Hay algunas estrategias, aquí hay un ejemplo:

function TotalOwnersPromise(Contract) {
return new Promise((resolve, reject) => {

     Contract.TotalOwners(function (error, result) {
        if (error) {
            reject(error);
            console.log("Total Owners Error");
        } else {

            resolve(result);
            console.log("Owners " + Owners);
        }
         });
     });
};

En cuanto a la gran cantidad de solicitudes que está realizando, necesitará ejecutar su propio nodo y tener algunos eventos y contratos de observación de node.js. No hay garantía de que infura o etherscan permitan en el futuro tantas solicitudes para martillarlas de forma gratuita.