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

时间:2019-12-11 15:39:41

标签: javascript reactjs scope

我无法访问推送到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变量中的数组,但是第二个日志显示为空。

3 个答案:

答案 0 :(得分:3)

假设chunksticketChunk都是数组,并且允许并行调用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);
});

如果chunksticketChunk不是数组,则可以使用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)
});
相关问题