我尝试了围绕await async的各种练习,发现了我无法解释循环遍历 map 与数组之间的奇怪行为
带 map :
async function loadFiles(files) {
var prs = files.map(getFile);
for (let pr of prs) {
console.log(await pr);
}
}
使用数组推送:
async function loadFiles(files) {
let prs = [];
files.forEach(file => {
prs.push(getFile(file));
});
for (let pr in prs) {
console.log(await prs[pr]);
}
}
现在两者都给我相同的结果 我不明白为什么在推送到数组的情况下, pr 是数组的索引 但有了 map ,它就直接是 promise 结果
它们都是 Promise 数组,是什么让它们在 for 中表现不同?
其余代码:
function getFile(file) {
return new Promise(function(resolve) {
fakeAjax(file, resolve);
});
}
loadFiles(["file1", "file2", "file3"]);
// **************************************
function fakeAjax(url, cb) {
var fake_responses = {
file1: "The first text",
file2: "The middle text",
file3: "The last text"
};
var randomDelay = (Math.round(Math.random() * 1e4) % 8000) + 1000;
console.log("Requesting: " + url);
setTimeout(function() {
cb(fake_responses[url]);
}, randomDelay);
}
最佳答案
您看到的差异是 for ... of
和 for ... in
之间的差异。
for ... of
迭代集合(如数组)中的值。您将获得实际的 Promise
对象。
for ... in
迭代对象的可枚举属性,在本例中为数组的属性 0、1、2...。
关于javascript - 异步 for 循环行为在 map 和 [].push 之间表现不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58033098/