在多维数组中获取承诺的结果

Posted

技术标签:

【中文标题】在多维数组中获取承诺的结果【英文标题】:Getting the results of a promise in a multidimensional array 【发布时间】:2016-07-30 19:05:45 【问题描述】:

我有一个要解决的多维承诺数组。如果我控制台记录结果,我可以查看数组,并且在每个数组中都有承诺以及 [[PromiseStatus]] 和 [[PromiseValue]]。如何获得承诺值?

这是一段代码:

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

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

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

【问题讨论】:

值的预期输出应该是什么?它也应该是一个具有已解析承诺值的多维数组吗? How to do promise.all for array of array of promises?的可能重复 【参考方案1】:

听起来您需要在最深的级别运行Promise.all,然后是下一个最深的级别,依此类推,直到您到达顶部。对于二维数组,这将是:

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);
);

【讨论】:

我会使用array.length === 0 来避免触发undefined,或者在查看length 之前检查类型,否则这个if 可能会触发纯值。另外,我会check for a .then method 而不是使用不可靠的instanceof【参考方案2】:

Promise.alliterable 作为它的参数。所以你只需要编写一个迭代器来遍历你的多维数组

 function *deepWalk(arr) 
   for (var item of arr)     
     if (Array.isArray(item))
       yield* deepWalk(item)
     else
       yield item;
   
 

 Promise.all(deepWalk(resourcePromises)).then(...

【讨论】:

【参考方案3】:

将此 sn-p 用于子数组:

const balancePromises = [...];
const symbolPromises = [...];

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

【讨论】:

【参考方案4】:

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], [...], [...]]


【讨论】:

以上是关于在多维数组中获取承诺的结果的主要内容,如果未能解决你的问题,请参考以下文章

从数据库结果生成多维数组的递归函数

PHP - 在多维数组中查找键

php中count获取多维数组长度的方法

JS----使用归递获取多维数组中的某列值

Java中如何获取多维数组的长度

将一个数组值与另一个多维数组匹配,然后从多维数组中获取值