Comment faire un getter à la truffe?

Téléportation de chèvre

Comment faire un getter à la truffe?


J’ai une fonction qui appelle un contrat et utilise la valeur de retour dans le code. Je veux changer cette fonction afin de pouvoir l’utiliser dans le reste de mon code comme getter à mon contrat.

La fonction est asynchrone, donc je ne peux pas faire quelque chose comme var res = App.getter(param); .

En regardant les autres fonctions asynchrones comme les appels, j’ai pensé que je pourrais utiliser .then ou promesses: ContractInstance.myFunction.call().then(function (result){ ... }); .then ContractInstance.myFunction.call().then(function (result){ ... });

Mais App.myFunction(i).then(function (result){ ... }); ne fonctionne pas, et je ne sais pas où chercher pour faire comme je veux.


Voici la fonction:

 getEventInfo :   function ( i ){ 
   var  numeroPlace ; 
   App . contracts . myContract . at ( addresses [ i ]). then ( function   ( instance )   { 
     var   MyContractInstance   =  instance ; 
     MyContractInstance . getEventInfo . call (). then ( function   ( result )   { console . log ( result ); 
         //do stuff with result 
         return  result ; 
     }); 
   }); 
 }, 

Je veux pouvoir faire quelque chose comme:

 var  eventInfo =   App . getEventInfo ( i ); 
 //do stuff with eventInfo 

ou

 App . getEventInfo ( i ). then ( function   ( result ){ 
   var  eventInfo =  result //do stuff with eventInfo 
 }; 

Réponses


 ReyHaynes

Selon la configuration de la truffe, vous pouvez utiliser [CONTRACT].deployed() qui est une promesse qui renvoie l’instance, et vous pouvez choisir d’utiliser then/catch ou async/await (ma méthode préférée si vous utilisez ES6) .

 // async / await contract . deployed (). then ( async   ( instance )   =>   { 
   const   get   =   await  instance . myFunction ({  from :  account }) 
   // ...additional code here. 
 }) 


 // .then/.catch contract . deployed (). then (( instance )   =>   { instance . myFunction ({  from :  account }). then (( data )   =>   { 
     // ...additional code here. 
   }) 
 }) 

Réponse à EDIT:

Ahh, gotcha. Vous devez simplement imbriquer vos retours.

 getEventInfo :   function ( i ){ 
   // var numeroPlace; 
   return   App . contracts . myContract . at ( addresses [ i ]). then ( function   ( instance )   { 
     return  instance . getEventInfo . call () 
   }). then ( function ( result )   { console . log ( result ); 
     //do stuff with result 
     return  result ; 
   }); 
 } 

… mais puisque vous retournez maintenant essentiellement une promesse, var eventInfo = App.getEventInfo(i); devra changer pour attendre que cette promesse se concrétise.

var eventInfo = await App.getEventInfo(i); le fera pour vous, mais, partout où cela est appelé, il doit se trouver à l’intérieur d’une fonction parent async . Donc, si vous définissez cette variable eventInfo à l’intérieur d’une fonction appelée loadEvent, alors:

 async   function  loadEvent ()   { 
   // ...additional stuff here. 
   var  eventInfo =   await   App . getEventInfo ( i ); 
   // ...additional stuff here. 
 } 

Plus d’informations ici: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

Téléportation de chèvre

J’ai édité la question pour ajouter mes fonctions, c’est beaucoup plus clair. La fonction fonctionne déjà, mais je voudrais l’utiliser comme une fonction qui renvoie quelque chose, pas faire le travail à l’intérieur de la fonction.

ReyHaynes

@TeleportingGoat gotcha. Réponse mise à jour.

Téléportation de chèvre

Merci. J’ai fait fonctionner async avec l’exemple dans la documentation mais cela ne fonctionne pas avec ma fonction. First eventInfo est défini sur undefined , puis après un certain temps, getEventInfo() renvoie sa valeur. Avez-vous une idée pourquoi cela se produit?

Téléportation de chèvre

App.getEventInfo() doit-il également être asynchrone? await clairement n’attend pas qu’il se termine. Ou peut-être y avez-vous une promesse? C’est juste un appel de fonction, donc il n’apparaît pas comme asynchrone.

ReyHaynes

@TeleportingGoat Edited getEventInfo . Il n’attendait pas le retour dans getEventInfo.call() . J’ai dû passer la promesse getEventInfo.call() dans une chaîne de promesses ultérieure.

 

#à, #la, comment, Faire, getter, truffe, un

 

yahoo

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *