给定以下代码
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将返回一个解析的承诺数组,而不是实际的承诺结果。
这很可能是因为
这个问题与如何从异步调用返回响应不同,因为它涉及如何返回包装在
您可以使用这个简单的函数来链接承诺以实现顺序执行:
null
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));
通过写这个问题,我设法找到了问题的根源。
Bluebird似乎有一个名为
类似地,有一个名为
我修改了代码,如下所示,代码正常工作:
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);
}
}