Вызов Ethereum Интеллектуальная контрактная функция внутри JS l oop не синхронизирована - PullRequest
0 голосов
/ 30 января 2020

У меня есть умный контракт, функция которого возвращает некоторые значения на основе сохраненных данных. Функция является защитной, как показано ниже

 function getPaperValues(uint _paperId) public view returns(string memory title,string memory ipfscid,address author,PaperStatus status,address[] memory reviewers,bytes32[] memory keywords,uint version)
{
    return (paperFiles[_paperId].title,paperFiles[_paperId].ipfs_cid,paperFiles[_paperId].author,paperFiles[_paperId].status,paperFiles[_paperId].reviewers,paperFiles[_paperId].keywords, paperFiles[_paperId].version_number);
}

Она прекрасно работает, если я вызываю ее через javascript, но у меня есть ситуация, когда мне нужно вызывать эту функцию внутри javascript под a для l oop. Проблема в том, что параметр "index" , когда я передаю это paperContractObj.getPaperValues ​​, возвращает мне правильные значения из блокчейна, но параметр "Index" значение меняется. Кажется, что функция не синхронизирована должным образом со временем вызова и временем результата.

                for (loop = 0; loop < result.length-1; loop++)
                {

                    var index = result[loop];
                    // this function takes index and return correct values as per associated index
                    paperContractObj.getPaperValues(index,{from:account},function (err, result2) {

                    // On this line index value shows different values even though result I received inside result2 is associated with the correct index.  

                    console.log("loop: -"+index); //need to fix this part loop id not coming properly it shows 

                        if (err) {
                            console.log("CALL-ERROR-REASON: "+JSON.stringify(err));
                            console.log("REASON: Unable to retrieve Paper values by Ids");
                        }
                        else {
                            console.log("CALL-SUCCESS: "+JSON.stringify(result2));
                            console.log("CALL-ACHIEVE: Recieved current papers values via ids successfully"+result[loop]);
                            addListHtmlDivs(result2,index); 
                            // Here values from the chain is coming fine but index which was provided as a parameter to this function is changed or different

                        }
     });

                }

Как я могу убедиться, что параметр внутри этой контрактной функции не изменяется из-за for l oop.

Ответы [ 2 ]

0 голосов
/ 13 февраля 2020

Эта проблема решается с помощью константного индекса в l oop

for (loop = 0; loop < result.length-1; loop++)
{

                    const index = result[loop];

, использование const даст правильное значение даже внутри основанного на событии результата вызова функции контракта.

0 голосов
/ 30 января 2020

Будет вызываться асинхронно функция контракта.

Просто поставьте

await

перед вызовом функции

paperContractObj.getPaperValues ​​

...