繁体   English   中英

Object.keys(myObject).forEach() 会同步执行吗?

[英]Will Object.keys(myObject).forEach() execute synchronously?

似乎无法找到像这样循环遍历 object 是否是非阻塞的答案。

    let workComplete = false;

    let itemFound = false;

    Object.keys(myObject).forEach((key, index) => {
      // check thousands of keys for a match
      if(key === someOtherValue) {
        itemFound = true;
      }
      if(index === Object.keys(myObject).length - 1) {
        workComplete = true;
      }
    });

    // Is it true that subsequent work here
    // will not execute until the forEach completes?
    console.log(workComplete);

上面的代码是否保证console.log()的调用总是将workComplete的值打印为true

您提供的代码全部同步执行。 它将使用第一个键同步运行您的 function,然后对第二个键执行相同的操作,依此类推,直到用完所有键。 只有这样它才会注销workComplete

您提供的代码将同步执行,部分原因是没有异步工作。 如果您在forEach()中调用异步 function ,那么它不会阻塞:

async function isThing(key) {
  return await checkIfThing(key);
} 

async function findThing() {

  // forEach will not await isThing, so
  // all calls will immediately after each other
  Object.keys(Things).forEach(isThing);

  // This syntax lets you do each await
  for (var key of Object.keys(things) {
    await isThing(key)
  }

}

您可以使用该 Promise 行为来执行诸如并行化一堆获取并在它们全部完成后解决之类的事情:

async function getThing(name) {
  return await fetch(`${url}/${name}`)
}

async function getAllThings() {
  const thingPromises = Object.keys(Things).map(getThing);
  const things = await Promise.all(thingPromises);
  return things;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM