给出以下代码
class SomeClass {
async someFunc() {
const urlParameters = [0, 1, 2];
const batchAjaxResult = await urlParameters.map((parameter) => {
const result = await $.get(`someUrl/${parameter}`);
return {
parameter,
result
}
});
console.log(batchAjaxResult);
}
}
JavaScript将返回一个已解析的Promises数组,而不是实际的Promises结果。
这可能是由于Array.map()
未被实施为承诺。
是否存在基于承诺的Array.map
版本?
这个问题与How to return the response from an asynchronous call不同,因为它是关于如何返回Array.map
内包含的批量响应。
答案 0 :(得分:3)
你可以使用这个简单的函数链接promises来实现顺序执行:
function asyncMap(arr, mapper) {
var q = Promise.resolve();
return Promise.all(arr.map(v => q = q.then(() => mapper(v))));
}
// Usage
asyncMap([1, 2, 3], v => {
return new Promise(resolve => {
console.log("Start " + v);
setTimeout(() => {
console.log("End " + v);
resolve("foo" + v);
}, 500);
});
}).then(a => console.log(a));
答案 1 :(得分:2)
通过写这个问题,我设法找到了问题的根源。
看起来Bluebird有一个名为Promise.map
类似地,有一个名为Promise.all
的本机实现创建了一个"批量承诺"
我按如下方式更改了代码并且它正在工作:
key1, sum(c1)
key1, key2, sum(c1)
key1, key2, key3, sum(c1)