Array.map()中的Promises的JavaScript异步/等待
JavaScript async/await for Promises inside Array.map()
给定以下代码
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()
没有作为Promise实现。
有基于Promise的Array.map
版本吗?
这个问题不同于如何从异步调用返回响应,因为它是关于如何返回封装在Array.map
中的批处理响应。
您可以使用这个简单的函数来链接承诺以实现顺序执行:
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));
通过写这个问题,我设法找到了问题的根源。
蓝鸟似乎有一个叫做Promise.map
的功能
类似地,有一个名为Promise.all
的本地实现,它创建了一个"批量承诺"
我更改了如下代码,它正在工作:
class SomeClass {
async someFunc() {
const urlParameters = [0, 1, 2];
const batchAjaxResult = await Promise.all(
urlParameters.map(async (parameter) => {
const result = await $.get(`someUrl/${parameter}`);
return {
parameter,
result
}
})
);
console.log(batchAjaxResult);
}
}
相关文章:
- esri javascript异步打印
- JavaScript异步问题
- Javascript异步成功函数-互斥
- 如何使用javascript异步更新我的内容
- 任何控制Javascript异步加载顺序的方法
- 循环内部的Javascript异步调用
- JavaScript:异步函数
- Javascript异步AJAX和递归排序
- 了解Javascript异步调用
- Javascript异步/等待ajax调用
- javascript异步和twitter的问题
- Javascript 异步用于复杂计算,但不是 ajax 调用
- JavaScript 异步编程:承诺与生成器
- JavaScript 异步循环不返回结果
- Javascript异步函数组合
- Javascript 异步返回
- 添加此 JavaScript 异步调整
- for 循环中的 JavaScript 异步调用
- 这种不规则行为是由Javascript异步运行引起的吗?
- Javascript - 异步函数完成后下一行如何等待执行