javascript - 负载过大时 typescript 异步功能不起作用

标签 javascript typescript asynchronous promise

假设我有这个模块:

export async function beFancy () {
  let i, j, load;
  // just for trying to delay the return;
  for (i = 0; i < 999; ++i) {
    for (j = 0; j < 999; ++j) {
      load = i + j;
    }
  }
  return 'beFancy finished';
}

现在我制作一个用于测试的主模块:

import {beFancy} from './mymodule';

beFancy().then((msg) => console.log(msg));
console.log('main finished');

如果我执行,输出符合预期

-> main finished
-> beFancy finished

因为 beFancy 是-asynchronous-

但现在如果我尝试让循环更激烈一些:

export async function beFancy() {
  let i, j, load;
  for (i = 0; i < 9999999; ++i) {
    for (j = 0; j < 999; ++j) {
      load = i + j;
    }
  }
  return 'beFancy finished';
}

再次执行main,输出是一样的

-> main finished
-> beFancy finished

但我希望 main finished 在函数 beFancy 实际被处理之前显示。相反,当 beFancy 完成时,上面的输出会一次性显示。起初我认为原因是因为输出只在程序结束时刷新但是如果我输入:

console.log('begin');
beFancy().then((msg) => console.log(msg));
console.log('main finished');

在“beFancy”执行之前显示“begin”,因此不满足我之前的假设。

因为 beFancy 是异步的,所以可能有什么问题?这是我机器上的意外行为吗?

最佳答案

So because beFancy is -asynchronous- what could possibly be wrong ?

那是因为只有 beFancy 返回值是异步的。 beFancy 大部分是同步的,会阻塞主线程。上面的代码大致相同:

  function beFancy () {
    return new Promise(resolve => {
      let i, j, load;
      for (i = 0; i < 999; ++i) {
        for (j = 0; j < 999; ++j) {
          load = i + j;
        }
      }
      console.log('logged on same tick')
      resolve('logged on next tick');
    });
  }

  console.log('begin');
  beFancy().then((msg) => console.log(msg));
  console.log('main finished');

为了使 async 函数中的循环是异步和非阻塞的,它应该使用 await 分块执行:

export async function beFancy () {
  let i, j, load;
  for (i = 0; i < 999; ++i) {
    await null; // next tick
    for (j = 0; j < 999; ++j) {
      load = i + j;
    }
  }
  return 'beFancy finished';
}

关于javascript - 负载过大时 typescript 异步功能不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49906997/

相关文章:

javascript - 如何记录、创建脚本然后立即使用它

javascript - 上传两个文件,处理它们并下载新文件,无需重定向

javascript - Vue.js router init 与 router.map 一起使用,而不是与 Router 构造函数一起使用

javascript - 如何分配异步函数中同步作用域中定义的变量?

javascript - Rails 3将rails数组传递给使用javascript数组的javascript函数

javascript - Angular 用指向页面片段的链接替换 ​​html 内容

flutter - While 循环停止计时器运行 (Dart)

javascript - queue.js 是如何工作的?

Angular4在div中加载外部html页面

javascript - 是的 addMethod 在 typescript 是的版本中不起作用