可以继续一个已停止的异步函数吗?

3

我正在学习 Promise 相关知识,想了解如何启动和停止异步函数,就像我的示例展示一样。它可以从开始时启动,点击按钮后停止,但似乎无法继续执行。

var stop = 0;
var elParrafo = document.getElementById('miParrafo');

function sendStop() {
  stop = 1;
}

function sendStart() {
  stop = 0;
}

function esperar(ms) {
  return new Promise(function(resolve, reject) {
    setTimeout(resolve, ms)
  });
}

async function trabajar() {
  while (stop === 0) {
    elParrafo.innerHTML += " > ";
    await esperar(50);
  }
}

trabajar();
<form class="" action="index.html" method="post">
  <input type="button" value="Stop" onclick="sendStop()">
  <input type="button" value="Start" onclick="sendStart()">
</form>
<p id="miParrafo"></p>


你的代码并不能停止 Promise,它只是停止触发新的 Promise。你可以通过再次调用 trabajar 来停止/启动你的循环,但 Promise 不能被取消。 - Gabriele Petrioli
1个回答

3

停止/重新启动和暂停之间有区别。您正在描述暂停和继续的功能。

如果您想要暂停/继续,您需要使用 while 循环来保持运行,并添加一个内部条件来检查当前是否处于暂停状态。

当然,您也可以只重复调用 trabajar(); 以重新启动,但重新启动和继续在逻辑上是两种不同的操作,重新启动可能需要清除现有输出,而继续则不需要。

这可能有很多方法,但最快速演示暂停/继续以及停止/重新启动的方式类似于以下内容。同样,请随意重新调用 trabajar(); ,但这取决于您自己。

var stop = false;
var pause = false;
var elParrafo = document.getElementById('miParrafo');

function sendPause() {
  pause = true;
}

function sendContinue() {
  pause = false;
}

function sendStop() {
  stop = true;
}

function sendRestart() {
  sendStop();
  setTimeout(function() {
    stop = false;
    pause = false;
    elParrafo.innerHTML = "";
    trabajar();
  }, 50)
}

function esperar(ms) {
  return new Promise(function(resolve, reject) {
    setTimeout(resolve, ms)
  });
}

async function trabajar() {
  while (!stop) {
    if (!pause) {
      elParrafo.innerHTML += " > ";
    }
    await esperar(50);
  }
}

trabajar();
<form class="" action="index.html" method="post">
  <input type="button" value="Pause" onclick="sendPause()">
  <input type="button" value="Continue" onclick="sendContinue()">
  <input type="button" value="Stop" onclick="sendStop()">
  <input type="button" value="Restart" onclick="sendRestart()">
</form>
<p id="miParrafo"></p>


非常感谢!那很可能是我真正想做的。 - Jesús Abad
我不需要“重新启动”功能,但是我在考虑,如果你不停止它而是一遍又一遍地“重新启动”它,如果你在其中删除“sendStop()”,那么Promise中的问题(内存方面)是什么。 - Jesús Abad
这只是一个例子,你可以选择自己需要的代码并应用它来满足你的需求。如果你不停止承诺并重新启动它,它将一遍又一遍地添加一个新的承诺实例,因此你的HTML更新会变得越来越快。你需要先停止它。我在示例中添加了setTimeout以确保承诺停止。再次强调,这只是一个快速演示/示例。 - Nope
我有一个新问题,与这个非常相似,但又不同。我该如何提问? - Jesús Abad
我创建了一个新问题:https://stackoverflow.com/questions/47695364/is-it-possible-continue-a-paused-async-function-2 - Jesús Abad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接