javascript - 如何在异步调用期间更新 DOM

标签 javascript jquery

如果我有一个如下的异步函数

async function predict_from_model() {
  $("#loading").html("first update")
  const model = await tf.loadModel('model.json');
  $("#loading").html("second update") //doesn't happen
  for (var i = 0; i < 100; i++) {
     const model = await tf.loadModel('model.json');
     $("#loading").html("more updates") //doesn't happen
  }
  ...
  <more code>
  ...
}

直到整个代码块完成后才会发生第二次和第三次更新。我在网上看到可以通过将函数包装在 setTimeout 中来解决此问题,但这对我来说也不起作用:

async function predict_from_model() {
  $("#loading").html("first update")
  const model = await tf.loadModel('model.json');
  setTimeout(function() {
      $("#loading").html("loaded") //doesn't happen
  }, 0);
  for (var i = 0; i < 100; i++) {
     const model = await tf.loadModel('model.json');
     $("#loading").html("more updates") //doesn't happen
  }
  ...
  ...
  <more code>
  ...
}

知道如何实现这一目标吗?

最佳答案

jquery dom 操作不应该因为函数的恢复而停止。这是一个快速(但肮脏)的片段,它表明:

var hardWork = function() {
  return new Promise((resolve, reject) => {
    setTimeout(_ => { 
      console.log("hardwork over")
      resolve();
    }, 2000)
  })
}

async function dom() {
  $("#loading").html('Loading')
  $('#status').html('Loading at ' + new Date())
  
  await hardWork();
  $('#status').html('Loading at ' + new Date())
  $("#loading").html('Loading 2')
  
  await hardWork();
  $('#status').html('Loading again at ' + new Date())
  $("#loading").html('Loading 3')

}
dom();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p id="status">

</p>
<p id="loading">

</p>

关于javascript - 如何在异步调用期间更新 DOM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50899469/

相关文章:

VisualForce 页面中的 Javascript - 表单提交成功,触发顶点?

javascript - 通过单击列表更改 div 内容?

javascript - 如何检查除特殊复选框外的所有复选框?

javascript - 如何从隐藏的输入中获取一些 id 并使用 jquery 或 javascript 对其进行切片?

javascript - 在 HTML5 Canvas 上使用 drawImage 调整颜色

javascript - 文档创建完整元素

javascript - 检测用户滚动是否超过 20px,无论其在页面上的哪个位置

javascript - 处理长 write() 参数的最佳方法是什么?

javascript - 如何禁用单击时隐藏输入

javascript - 将 JS 变量放置在我的模态的 HREF 链接中