2017-04-10 91 views
1

我正在构建与以太坊区块链连接的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