我无法访问推送到for loop
外部声明的变量的数组数据。
let tickets = [];
(async () => {
for (let chunk of chunks) {
try {
let ticketChunk = await someMethod(chunk)
tickets.push(...ticketChunk)
console.log("first log", tickets)
} catch (error) {
console.error(error)
}
}
})();
console.log("second log", tickets)
上面的代码在第一个日志上正确显示了tickets
变量中的数组,但是第二个日志显示为空。
答案 0 :(得分:3)
假设chunks
和ticketChunk
都是数组,并且允许并行调用someMethod()
,这是使用map()
和{ {3}}:
Promise.all(
chunks.map(async chunk => {
try {
const ticketChunk = await someMethod(chunk);
// some other async functions...
return ticketChunk;
} catch (error) {
console.error(error);
return [];
}
})
).then(ticketChunks => {
const tickets = ticketChunks.flat();
console.log(tickets);
});
如果chunks
或ticketChunk
不是数组,则可以使用flat()
复制上述行为:
function* map(iterable, callback) {
for (const value of iterable) {
yield callback(value);
}
}
function isIterable(arg) {
return typeof Object(arg)[Symbol.iterator] === 'function';
}
function* flat(iterable, depth = 1) {
for (const value of iterable) {
// value !== iterable prevents recursion on unit length strings
if (depth > 0 && isIterable(value) && value !== iterable) {
yield* flat(value, depth - 1);
} else {
yield value;
}
}
}
Promise.all(
map(chunks, async chunk => {
try {
const ticketChunk = await someMethod(chunk);
// some other async functions...
return ticketChunk;
} catch (error) {
console.error(error);
return [];
}
})
).then(ticketChunks => {
const tickets = [...flat(ticketChunks)];
console.log(tickets);
});
答案 1 :(得分:1)
因为您的“主要”功能是异步的
尝试:
let tickets = [];
for (let chunk of chunks) {
try {
let ticketChunk = await someMethod(chunk)
tickets.push(...ticketChunk)
console.log("first log", tickets)
} catch (error) {
console.error(error)
}
}
console.log("second log", tickets);
或
let tickets = [];
const someStuff = async() => {
for (let chunk of chunks) {
try {
let ticketChunk = await someMethod(chunk)
tickets.push(...ticketChunk)
console.log("first log", tickets)
} catch (error) {
console.error(error)
}
}
}
await someStuff();
console.log("second log", tickets);
答案 2 :(得分:0)
您需要等待必须执行的异步功能,然后才能尝试处理其中已加载的数据。看起来有点像这样:
let tickets = [];
(async () => {
for (let chunk of chunks) {
try {
let ticketChunk = await someMethod(chunk)
tickets.push(...ticketChunk)
console.log("first log", tickets)
} catch (error) {
console.error(error)
}
}
})().then(() => {
console.log("second log", tickets)
});