Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/451.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 承诺不起作用:代码在任务尚未完成时执行_Javascript - Fatal编程技术网

Javascript 承诺不起作用:代码在任务尚未完成时执行

Javascript 承诺不起作用:代码在任务尚未完成时执行,javascript,Javascript,编辑:你能发现这个扑克游戏中的漏洞吗?这快把我逼疯了。这个承诺不起作用。另外,最多可与9名玩家玩扑克。虽然我指定了球员的数量,但我还是设法有了10名球员。我不知道发生了什么事。有人能帮我吗 function playerActs(i, s) { return new Promise(resolve => { console.log(`player ${i+1} took ${(s/1000).toFixed(2)} secs to decide`); resolve('

编辑:你能发现这个扑克游戏中的漏洞吗?这快把我逼疯了。这个承诺不起作用。另外,最多可与9名玩家玩扑克。虽然我指定了球员的数量,但我还是设法有了10名球员。我不知道发生了什么事。有人能帮我吗

function playerActs(i, s) {
  return new Promise(resolve => {
    console.log(`player ${i+1} took ${(s/1000).toFixed(2)} secs to decide`);
    resolve('finished');
  });
}

async function round() {

  let hasEveryoneSpoken = false;
  let hasEveryoneChecked = false;
  let isEveryoneAllIn = false;
  let stopBettingRound = false;

  let nbPlayers = 9;

  let i = 0;
  while (!stopBettingRound) {

    let delay = (Math.random() * 1000 * 5);

    // wait until the player take a decision
    let res = await setTimeout(playerActs, delay, i, delay);
    console.log(res);

    // dummy condition to exit loop
    if (i == nbPlayers) hasEveryoneSpoken = true;

    stopBettingRound =
      hasEveryoneSpoken || hasEveryoneChecked || isEveryoneAllIn;

    i++;
  }
}

round();

您不能像这样使用
setInterval
,因为与promission一样,它不会阻止代码执行,因此代码直接进入您对
resolve
的调用

我建议您将整个倒计时逻辑重构为它自己的函数,该函数还包含一个承诺,您可以等待


也就是说,如果用户在等待时继续下一步操作,我也看不到任何逻辑允许您取消倒计时。

目前,我的重点是阻止程序的执行,而人必须进行交互:)这就是问题所在-您不能阻止执行。您可以
等待
承诺,该承诺的解决方案取决于计时器是否过期(在这种情况下,您可以
拒绝
)或用户输入是否发生。