首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法从For循环内部从For循环外部访问数据

无法从For循环内部从For循环外部访问数据
EN

Stack Overflow用户
提问于 2019-12-11 15:39:41
回答 3查看 80关注 0票数 4

我无法访问推送到for loop之外声明的变量的数组数据。

代码语言:javascript
运行
复制
        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变量中的数组,但是第二个日志显示为空。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-12-11 15:51:05

假设chunksticketChunk都是数组,并且允许并行调用someMethod(),下面是一种使用map()flat()的更简单、更快的方法

代码语言:javascript
运行
复制
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);
});

如果chunksticketChunk不是数组,则可以使用发生器函数复制上述行为:

代码语言:javascript
运行
复制
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);
});
票数 3
EN

Stack Overflow用户

发布于 2019-12-11 15:48:51

因为“主”函数是异步的。

试着:

代码语言:javascript
运行
复制
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);

代码语言:javascript
运行
复制
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);
票数 1
EN

Stack Overflow用户

发布于 2019-12-11 15:48:03

在尝试处理加载在其中的数据之前,您需要等待必须执行的异步函数。看起来有点像这样:

代码语言:javascript
运行
复制
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)
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59289279

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档