2017-04-10 10 views
1

私はEthereumブロックチェーンで接続されたDappsを構築しています。内部に非同期メソッドを呼び出すJavaScript関数があります。非同期メソッドで表示する配列を渡すことができません

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; 
} 

この最初のメソッドは非同期であるべきですか?

次に、私はヘルパーに前のものを呼び出す関数を持っています。これは私が持っているもっとも近いバージョンですが、約束オブジェクトを返しています。
このバージョンでは、console.log()に[[PromiseValue]]が正しいことがわかります。
しかし、私は自分のビューに{{#each files}}で下のコードを表示しようとすると何も起こらないのに対し、tmpを返すと[Object Promise]が表示されます。 それはうまく送信できますか?アレイをどのように表示するのですか?

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

答えて

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); 

上記のコードは、非同期関数が正常に終了する非同期呼び出しを待って強制コールバックを使用して正しく実行できるようにする必要があり、その上に、コールバック以下のすべてのものにも実行されます。残念なことに、コールバックは非同期なので、値を同期関数に戻すことはできません。しかし、配列がグローバルであれば、displayFile(getFiles)が呼び出された後に配列が必要な値を持つ必要があります。これは私のために動作しませんでした

ThisではJavaScript

+0

にコールバックと非同期プログラミングを理解するために、より役立つかもしれない...私はonCreated()メソッドに直接呼び出しを置くことによってそれを行うために管理し、ときました配列にプッシュすると毎回TemplateVar.setが使用されます。 – glaulom

関連する問題