在多维数组中获取promise的结果
Getting the results of a promise in a multidimensional array
我有一个多维的承诺数组,我正在努力解决。如果我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);
});
如果你想进入任意深度,那么你需要在每个级别的map
和all
之间进行选择:
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], [...], [...]]
相关文章:
- 如何为javascript promise进行阻塞并返回解析结果
- async问题,JS Promise无法返回结果,但可以使用console.log
- 使用Node中的Q promise库对值数组顺序调用/执行相同的函数;并返回带有结果的新数组/集合
- 在多维数组中获取promise的结果
- 如何访问AngularJS promise链中上一个promise的结果
- 如何使用 Parse.promise javascript 定义一个承诺数组并获取结果数组 [parse.com]
- 在返回结果之前,我如何等待 jQuery.ajaxComplete in promise.done
- 使用 promise 将异步函数的结果作为“变量”返回
- JavaScript原生Promise对两个结果执行回调
- 用promise处理promise的数组结果
- ES7使用wait生成器从一系列promise中获取结果
- 为什么defered.promise在defered.resolve(myobject)之后的结果与myobject不同
- 当你想要所有结果而不管是否被拒绝时,用什么代替Promise.all()
- 什么'这是处理promise对象中错误结果的正确方法
- 如何在promise解析时手动将promise的结果获取到作用域变量中
- JS Promise无法返回结果
- request-promise -我如何从函数外的Promise获得结果?
- 承诺的循环.如何检测哪个promise现在返回结果
- 在下一次循环迭代之前等待promise结果
- Promise API -结合2个异步调用的结果