【问题标题】:JS Synchronous loop not stoppingJS同步循环没有停止
【发布时间】:2020-12-29 20:58:36
【问题描述】:

我在文档中有一个运行功能的按钮,该功能旨在帮助用户在添加到 roblox 的每个用户之间导航。出于某种原因,我的承诺不会等到再次单击按钮,而是在几秒钟内遍历数组中的每个元素。我的代码不多,因为我刚遇到这个错误

HTML

       <div class="buttons">
           <div class="pass" onclick="manager('pass')">
               <img src="../assets/x.png">
           </div>
           <div class="check" onclick="manager('unfriend')">
               <img src="../assets/check.png">
           </div>
       </div>

功能

async function manager(type) {
    let friends = await getUsers();

   for(const user of friends) {
       let friend = await getUser(user.id)

     await (new Promise(((resolve => {
         if(type == 'pass') {
             username.innerText = friend.name;
             profile.src = friend.thumbnail
             return resolve()
         }
         
     }))))

   }
}

【问题讨论】:

  • 我看不到任何让它等待点击的东西。我也没有看到任何地方定义的类型。
  • 使异步的东西实际上不是异步的没什么意义。整个内部的承诺可以/应该被删除。承诺进行副作用更改而不是返回值也非常令人费解。
  • 如果你需要用户交互,循环是没有意义的......

标签: javascript node.js for-loop


【解决方案1】:

if(type == 'pass') 是在评估代码时对type 值的简单测试。

那里没有任何东西会导致它等待type 的值改变。

(当然,Promise 不会让代码等待任何事情:您的 Promise 立即测试 type 的值,然后要么一直处于挂起状态,要么立即分配 innerText 和 @987654326 @ 然后立即解析。Promise 是管理已经异步的代码的工具,它们不能使同步代码异步)

如果你想等待点击一个按钮,那么你需要一个点击事件监听器。

【讨论】:

  • 扩展:如果在执行 promise 时键入 != 'pass',则 promise 永远不会解决,并且 promise 上的 await无限期阻塞.
  • html中的onclick属性不也算点击事件吗?我在最后运行这个函数
  • @fxncis — 如果您调用 manager 来响应点击事件,那很好,但不会对该函数中间的 promise 产生任何影响。跨度>
  • @Quentin,我会尝试使用点击事件。有什么问题我会回来的。
  • 嗯,我不确定点击事件。我认为这是因为我有一个包含 roblox 用户数据的数组,一旦您单击 pass div,它将在数组中显示另一个人。意思是,我必须得到当前用户并继续下一个。不像函数,因为我会让它移动到 for 循环中的下一个用户。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-23
  • 1970-01-01
相关资源
最近更新 更多