![](/img/trans.png)
[英]calling an async function inside for loop in JavaScript / node js
[英]Calling async function inside a loop
我有以下功能:
function ipfsRetrieve( ipfsHash ){
return new Promise( function( resolve, reject ) {
ipfs.catJSON( ipfsHash, (err, result) => {
if (err){
reject(err);
}
resolve( result);
});
});
}
現在,當我在如下循環中調用此函數時:
var hashArray = [ "QmTgsbm...nqswTvS7Db",
"QmR6Eum...uZuUckegjt",
"QmdG1F8...znnuNJDAsd6",
]
var dataArray = [];
hashArry.forEach(function(hash){
ipfsRetrieve( hash ).then(function(data){
dataArray.push(data);
});
});
return dataArray
“ return dataArray”行返回一個空數組。如何更改此代碼以使“ dataArray”填充有從IPFS檢索的數據?
您應該使用Promise.all
。
構造一個Promises數組,然后使用該方法等待所有Promise兌現,然后您可以按正確的順序使用該數組:
let hashArray = ["QmTgsbm...nqswTvS7Db", "QmR6Eum...uZuUckegjt", "QmdG1F8...znnuNJDAsd6", ] // construct Array of promises let hashes = hashArray.map(hash => ipfsRetrieve(hash)); Promise.all(hashes).then(dataArray => { // work with the data console.log(dataArray) });
對於初學者,您需要在拒絕后返回,否則您的解決方案也會被調用。
function ipfsRetrieve( ipfsHash ){
return new Promise( function( resolve, reject ) {
ipfs.catJSON( ipfsHash, (err, result) => {
if (err){
reject(err);
return;
}
resolve( result);
});
});
現在進行循環,使用map代替forEach並返回promise。 然后等待諾言。
let promises = hashArry.map(hash=> return new Promise(resolve,reject) { // your code here handling hash, updating theData, and then resolving })
return Promise.all(promises).then( ()=> return theData)
在您的情況下,promise由ipfsRetrieve提供,因此您將調用
let promises = hashArry.map(ipfsRetrieve)
return Promise.all(promises)
函數的調用者將執行以下操作:
ipfsRetrieve().then(data=>{ // process data here } )
如果您對異步等待很滿意,請執行此操作。 (將包含功能的標記為異步)
let data = await ipfsRetrieve()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.