2017-04-10 4 views
1

Je construis un Dapps connecté avec Ethereum Blockchain. J'ai une fonction JavaScript qui appelle une méthode asynchrone à l'intérieur.Impossible de passer le tableau à afficher avec des méthodes asynchrones

async function getFiles(id, array){ 
    if(id < 2){ 
     myContract.consultFile.call(id,"0x2b461Db580028F263351B969cFd8542db696787E",function(err, res){ 
      array.push({title : res[0], description : res[1]}); 
      getFiles(++id, array); 
     }); 
    } 
    return array; 
} 

Ces premières méthodes devraient-elles être asynchrones?

Ensuite, j'ai dans mon assistant une fonction qui appelle la précédente. C'est la version la plus proche que j'ai, mais elle retourne un objet de promesse.
Avec cette version, je peux voir avec console.log() que [[PromiseValue]] est correct.
Mais quand j'essaie de l'afficher avec {@each files}} avec le code ci-dessous, rien ne se passe, alors que si je renvoie tmp je peux voir [Object Promise]. Le tableau est-il bien envoyé? Comment dois-je afficher le tableau?

Template.myDocuments.helpers({ 
    'files': function(){ 
     var tmp = getFiles(0,[]); 
     tmp.then(function(val){ 
     console.log(val); 
     return val; 
    }); 
    } 
}); 

Répondre

0
function displayFile(callback){ 
    callback(0,[]); 
} 

function getFiles(id, array){ 
    while(id++ < 2){ 
     myContract.consultFile.call(id,"0x2b461Db580028F263351B969cFd8542db696787E",function(err, res){ 
     array.push({title : res[0], description : res[1]}); 
    } 
    console.log(array); 

} 
displayFile(getFiles); 

Le code ci-dessus devrait permettre à la fonction async de fonctionner correctement en utilisant callbacks, qui mettent en application en attendant le l'appel asynchrone pour terminer avec succès, sur lequel, tout en dessous du rappel sera également exécuter. Malheureusement, étant donné que le rappel est asynchrone, vous ne pouvez pas en renvoyer une valeur à une fonction synchrone. Mais si le tableau est global, il devrait avoir la valeur que vous voulez après l'appel de displayFile (getFiles).

This peut être plus utile à la compréhension et callbacks programmation asynchrone en javascript

+0

Cela ne fonctionne pas pour moi ... Je suis parvenu à le faire en mettant l'appel directement dans la méthode onCreated() et quand En poussant dans le tableau, utilisez TemplateVar.set à chaque fois. – glaulom