javascript异步如何与周期一起使用?

时间:2019-05-26 22:14:25

标签: javascript asynchronous

我正在尝试了解异步如何在javascript中工作。我无法处理创建异步的1件事:与其他promise生成器和回调或webAPI的异步函数?

这是一个代码。如果我正在使用settimeout函数,则所有功能都可以正常工作,但是如果我使用周期,则某些功能将无法预测;然后我使用settimeout结果显示1和1的超时,但同时显示周期结果

function timeout(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}
async function sleep() {
  console.time("abc");
  await timeout(3000);
  console.timeEnd("abc");
}

sleep();

console.time();
var z = 1;
for (let i = 1; i < 10000; i++) {
  for (let j = 1; j < 10000; j++) {
    z *= j;
  }
  z *= i;
}
console.timeEnd();


//second var

function second(ms) {
  return new Promise(resolve => {
    var z = 1;
    for (let i = 1; i < 50000; i++) {
      for (let j = 1; j < 50000; j++) {
        z *= j;
      }
      z *= i;
    }
    resolve();
  });
}

// function timeout(ms) {
//   return new Promise(resolve => setTimeout(resolve, ms));
// }
async function sleep() {
  console.time("abc");
  await second();
  console.timeEnd("abc");
}

sleep();

console.time();
var z = 1;
for (let i = 1; i < 10000; i++) {
  for (let j = 1; j < 10000; j++) {
    z *= j;
  }
  z *= i;
}
console.timeEnd();

//第一个结果显示超时显示1比1

默认值:932.822998046875ms

abc:3000.555908203125ms

//秒结果同时显示

默认:913.716064453125ms

abc:4396.77490234375ms

1 个答案:

答案 0 :(得分:-1)

您正在使用的常规for循环在进行下一次迭代之前不会等待Promise的解析。您可以使用像bluebird这样的库,该库针对Promise处理进行了优化(尤其是对于集合),也可以使用for (i in arr){}循环。