Suppression d'un élément en toute sécurité par index du tableau changeant


flo

Disons que des éléments sont fréquemment ajoutés via push dans un tableau. Une autre fonction async (qui s'exécute indépendamment dans un contexte setInterval) supprime les éléments aléatoires du tableau.

Dans cette deuxième fonction, lorsque j'évalue sur une ligne l'index de l'élément à supprimer, le tableau peut changer avant que j'atteigne la ligne suivante où je fais array.splice(index, 1). Correct? Le mauvais élément serait supprimé.

Comment dois-je résoudre cela?

EDIT : exemple :

async function analyze() {

  let pendingTxs = [] 

  web3.eth.subscribe('pendingTransactions', function(error, result){
    if (error) console.log(error);
  })
  .on("data", async function(hash){   
    pendingTxs.push(hash)    
  })  

  setInterval(async () => {    
    
    let promises = pendingTxs.map(pTx => {return web3.eth.getTransaction(pTx)})

    let updatedTransactions = await Promise.all(promises)

    for (let index = 0; index < updatedTransactions.length; index++) {
      const txUpdated = updatedTransactions[index];
      if (txUpdated.transactionIndex != null) {
        const index = pendingTxs.indexOf(txUpdated.hash)
        if (index > -1) {          
          pendingTxs.splice(index, 1);          
        }
      }
    }

  },250)
  
}

analyze()

EDIT2 : Je pense que Chris a peut-être raison dans ce cas.

Mike Samuel

Non.

const index = pendingTxs.indexOf(txUpdated.hash)
if (index > -1) {          
  pendingTxs.splice(index, 1);          
}

fonctionne comme une unité.

Les asyncfonctions de JavaScript sont coopératives et non préemptives.

« Différence entre le multitâche préemptif et coopératif »

Dans le multitâche coopératif , le [contrôleur] n'initie jamais le changement de contexte du [thread] en cours d'exécution à un autre [thread]. Un changement de contexte se produit uniquement lorsque le [thread] cède volontairement le contrôle

puisque JS est basé sur la concurrence de boucle d'événement

Donc, si vous faites un awaitou yield, un autre code peut s'exécuter, mais si vous ne faites pas explicitement l'une de ces actions de pause, les instructions ci-dessus s'exécutent comme une unité.

Les SharedArrayBuffer sont une exception car l'hôte est autorisé à partager largement son contenu, mais les Array ne le sont pas.

Articles connexes


Suppression d'un élément de tableau par valeur

Marek J'ai besoin de supprimer l'élément de tableau avec une valeur donnée: if (in_array($id, $items)) { $items = array_flip($items); unset($items[ $id ]); $items = array_flip($items); } Cela pourrait-il être fait de manière plus courte (plus effi

Suppression d'un élément de tableau particulier du tableau

Arthur Gharibyan J'ai besoin de supprimer un élément choisi du tableau, en cliquant sur supprimer dans mon code, mais je ne peux pas atteindre l'objectif jusqu'à présent. J'essayais de comparer la valeur actuelle du tableau avec la valeur de la balise et si el

Comment supprimer en toute sécurité un élément d'un vecteur ?

Nurbol Alpysbayev Disons que j'ai ce vecteur : let mut v = vec![1,2,3]; Et je veux en supprimer un élément : v.remove(3); Ça panique. Comment puis-je attraper/gérer gracieusement cette panique ? J'ai essayé d'utiliser panic::catch_unwindmais cela ne semble p