【问题标题】:synchronous while loop javascript同步while循环javascript
【发布时间】:2019-04-13 12:40:26
【问题描述】:

我想要这个输出 1,1,1,....

而不是 2,1

我想同步运行

//just wait 2 seconds
function s(callback){
    setTimeout(() => {
        callback()
    }, 2000);
}
a=[2]
while (a.length!==0){
    a.shift()
    s(()=>{
        a.push(2)
        console.log('1');
    })
}
console.log('2');

【问题讨论】:

  • 这是同步运行的。 setTimeout 并不意味着代码正在异步运行
  • 这个问题可能已经在那里解决了:stackoverflow.com/questions/4122268/…
  • 你要无限循环打印 1 吗?
  • 尚不清楚为什么数组甚至存在于a=[2],但知道其中的原因会很有趣——尽管它似乎不是问题的一部分。
  • 作为一个无限循环,这最终可能会在检测到这一点的现代浏览器中弹出一个错误。

标签: javascript while-loop callback synchronous


【解决方案1】:

使用当前代码实现此目的的一种方法是使用 async/await 和 Promises。

//just wait 2 seconds
function s(callback) {
  return new Promise(resolve => {
    setTimeout(() => {
      callback()
      resolve()
    }, 2000);
  })
}

const main = async function() {
  const a = [2];
  while (a.length !== 0) {
    a.shift()
    // This "waits" for s to complete. And s returns a Promise which completes after 2 secs
    await s(() => {
      a.push(2)
      console.log('1');
    })
  }
  console.log('2');
}

main()

如果你真的只需要一个无限循环while(true) { /* ... */ }就足够了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-31
    • 2014-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-14
    • 2018-02-19
    相关资源
    最近更新 更多