请看下面的代码
var arr = await [1,2,3,4,5].map(async (index) => {
return await new Promise((resolve, reject) => {
setTimeout(() => {
resolve(index);
console.log(index);
}, 1000);
});
});
console.log(arr); // <-- [Promise, Promise, Promise ....]
// i would expect it to return [1,2,3,4,5]
快速编辑: 接受的答案是正确的,因为映射对异步函数没有做任何特殊的事情。我不知道为什么我认为它可以识别 async fn 并且知道等待响应。
也许我期待着这样的事情。
Array.prototype.mapAsync = async function(callback) {
arr = [];
for (var i = 0; i < this.length; i++)
arr.push(await callback(this[i], i, this));
return arr;
};
var arr = await [1,2,3,4,5].mapAsync(async (index) => {
return await new Promise((resolve, reject) => {
setTimeout(() => {
resolve(index);
console.log(index);
}, 1000);
});
});
// outputs 1, 2 ,3 ... with 1 second intervals,
// arr is [1,2,3,4,5] after 5 seconds.
因为
async
函数always返回一个promise;并且 map
没有异步的概念,也没有对 Promise 进行特殊处理。
但是你可以轻松等待结果
Promise.all
:
try {
const results = await Promise.all(arr);
// Use `results`, which will be an array
} catch (e) {
// Handle error
}
实例:
var arr = [1,2,3,4,5].map(async (index) => {
return await new Promise((resolve, reject) => {
setTimeout(() => {
resolve(index);
console.log(index);
}, 1000);
});
});
(async() => {
try {
console.log(await Promise.all(arr));
// Use `results`, which will be an array
} catch (e) {
// Handle error
}
})();
.as-console-wrapper {
max-height: 100% !important;
}
或使用 Promise 回调:
Promise.all(arr)
.then(results => {
// Use `results`, which will be an array
})
.catch(err => {
// Handle error
});
实例:
var arr = [1,2,3,4,5].map(async (index) => {
return await new Promise((resolve, reject) => {
setTimeout(() => {
resolve(index);
console.log(index);
}, 1000);
});
});
Promise.all(arr)
.then(results => {
console.log(results);
})
.catch(err => {
// Handle error
});
.as-console-wrapper {
max-height: 100% !important;
}
旁注:由于
async
函数总是返回 Promise,并且您在函数中 await
唯一的东西就是您创建的 Promise,因此在这里使用 async
函数是没有意义的。只需返回您正在创建的承诺即可:
var arr = [1,2,3,4,5].map((index) => {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(index);
console.log(index);
}, 1000);
});
});
当然,如果你真的在那里做一些更有趣的事情,在各种事情上使用
await
(而不仅仅是new Promise(...)
),那就不同了。 :-)
由于它是异步的,因此在
map
返回时尚未确定值。在运行箭头函数之前它们不会存在。
这就是 Promise 存在的原因。它们是对未来可用价值的承诺。