javascript - 如何使用 async/await 去抖动?

标签 javascript async-await lodash debouncing

我有一个输入框。在用户停止输入后,我想执行一个 HTTP 请求并等待结果。

Here's a jsbin

由于 jsbin 不允许网络请求,因此我使用 setTimeout() 代替。

var log = console.log.bind(console)

var delayedResults = new Promise(function(resolve) {
  setTimeout(function(){
    resolve('Wooo I am the result!')
  }, 3000);
});

document.querySelector('input').addEventListener('input', _.debounce(async function(){
  log('Doing search')
  var result = await delayedResults
  log('Result is', result)
}), 500);

但是,当我在框中键入内容时,每个字符都会立即出现“正在搜索”——我希望它仅在 500 毫秒过期后出现。

如何使用 debounce 和 await?

最佳答案

问题出在最后一行:

}), 500);

您应该在指定时间参数之后关闭debounce 函数调用:

}, 500));

var log = console.log.bind(console);

var delayedResults = new Promise(
  function(resolve) {
    setTimeout(function() {
      resolve('Wooo I am the result!');
    }, 3000);
  }
);

document.querySelector('input')
  .addEventListener('keydown', _.debounce(async function() {
    log('Doing search');
    var result = await delayedResults;
    log('Result is', result);
  }, 500));
<script src="https://cdn.jsdelivr.net/lodash/4/lodash.min.js"></script>
<input>

关于javascript - 如何使用 async/await 去抖动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44501653/

相关文章:

javascript - 如何使用 lodash 从子项中查找父项名称并打印路径

javascript - 使用 JavaScript 获取相当于 "max-width: 600px"的 css

php - 如何选择单个或多个复选框按钮?

javascript - 无法在 safari 中隐藏嵌入 iframe 中的 PDF?

c# - 单元测试异步方法 - 测试永远不会完成

javascript - 使用 linq.js,我需要按 2 个字段进行分组并生成摘要

javascript - Flexigrid 中没有新查询的订单

javascript - Express 中的 Node.js 异步等待

c# - 延迟异步方法的最小起订量返回不延迟

javascript - 对象中数组内的 Lodash Map 数组