在多维数组中获取promise的结果

Getting the results of a promise in a multidimensional array

本文关键字:promise 结果 获取 数组      更新时间:2024-03-22

我有一个多维的承诺数组,我正在努力解决。如果我console.log得到结果,我就可以查看数组,每个数组中都有promise以及[[PromiseStatus]]和[[PromiseValue]]。如何获得承诺值?

下面是一段代码:

(resourcePromises只是一个多维的承诺数组)。

    Promise.all(resourcePromises).then(function(values)
    {
        console.log(values);
    });

然后变量值将包含多个数组,在每个数组中都有一个承诺列表,我正试图从中获取值。

听起来您需要在最深级别运行Promise.all,然后再运行下一个最深级别,依此类推,直到达到顶部。对于2D阵列,这将是:

Promise.all(promises.map(Promise.all)).then(function(values) {
    console.log(values);
});

如果你想进入任意深度,那么你需要在每个级别的mapall之间进行选择:

function deepAll(array) {
    if (array instanceof Promise)
        // Just in case...
        return array;
    else if (array.length == 0)
        // The 'real' function will fail with an empty array and it's the same in both cases anyhow.
        return [];
    else if (Array.isArray(array[0]))
        // There's another array level, so turn it into an array of promises.
        return array.map(deepAll);
    else
        // This is an array of promises, and we already have a function for that case.
        return Promise.all(array);
}
deepAll(promises).then(function(values) {
    console.log(values);
});

Promise.all可迭代作为其参数。所以你只需要写一个迭代器,它可以遍历抛出你的多维数组

 function *deepWalk(arr) {
   for (var item of arr) {    
     if (Array.isArray(item))
       yield* deepWalk(item)
     else
       yield item;
   }
 }
 Promise.all(deepWalk(resourcePromises)).then(...

将此片段用于子数组:

const balancePromises = [...];
const symbolPromises = [...];
const [balances, symbols] = await Promise.all([
    Promise.all(balancePromises),
    Promise.all(symbolPromises)
]);

Andrew Taylor给出的答案很好。我花了一段时间才弄清楚如何为特定的2d阵列实现它,所以我想展示我是如何实现它的,以了解更多关于Promise.all:的信息

// This function will iterate over a 2d array of IDs to load async data
// based on each ID and resolve all of the promises before proceeding.
const getAsyncData = async (outerArray) => {
  const data = await Promise.all(
    outerArray.map(async innerArray => await Promise.all(
        innerArray.map(async id => await mockGettingDataFromServer(id))
    ))
  )
  return data;
}
// This function will simulate getting data from the IDs asynchronously
function mockGettingDataFromServer(id) {
  return new Promise((resolve, reject) => {
     window.setTimeout(() => {
       resolve(`Resolved ${id}`)
     }, 10)
  });
}
// A 2d array of IDs
const ids = [['ID1', 'ID2', 'ID3'], ['ID1', 'ID4'], ['ID2', 'ID3', 'ID5']];
// Pass the 2d array of IDs to the getAsyncData function to get an
// array of arrays of resolved promises, e.g. data from the server
const myData = getAsyncData(ids);
console.log(myData); // [["Resolved ID1", etc], [...], [...]]