javascript - 在循环内调用异步函数

标签 javascript asynchronous

我有以下功能:

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

构造一个 Promise 数组,然后使用该方法等待所有 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) 
});

关于javascript - 在循环内调用异步函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51731443/

相关文章:

javascript - 如何返回表示元素字符串长度的数字数组?

javascript - 循环不适用于间隔

javascript - 无法从 ngResource 对象访问属性

node.js - async.each 表插入麻烦?

Javascript - 并行调用两个异步函数并将两个结果传递给第三个函数

javascript - 如何在 JavaScript 中使用 Observables 来处理 "eachSeries"?

javascript - jQuery 切换自己的文本颜色和从其他人删除文本颜色

javascript - 在 jquery 元素上使用 Lodash 集合函数

java - 等待 onPostExecute 完成以制作新的适配器

java - 如何使用 k() 函数在 kdb/q 中接收数据