Suppression d'un élément en toute sécurité par index du tableau changeant
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.
Non.
const index = pendingTxs.indexOf(txUpdated.hash)
if (index > -1) {
pendingTxs.splice(index, 1);
}
fonctionne comme une unité.
Les async
fonctions 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 await
ou 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.