2017-04-10 92 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