【问题标题】:js Promise, cancel timeoutjs Promise,取消超时
【发布时间】:2016-11-09 12:27:42
【问题描述】:

目前我正在使用脚本在执行下一个操作之前为我的函数设置 3 秒的超时时间。

function sleep(ms)
{
    return new Promise((resolve) => setTimeout(resolve, ms));
}

sleep(3000).then(function()
{
    // next action
});

现在我想找到一种方法来提前结束 3 秒超时,例如通过执行鼠标单击。我将如何实施?

【问题讨论】:

  • 您为此使用 Promise 有什么特别的原因吗?承诺很棒,但不可取消。 setTimeout 返回一个 ID,您可以使用它来取消即将进行的函数调用。
  • 您需要清除超时,然后根据需要调用解析器,或者继续前进。

标签: javascript promise cancellation


【解决方案1】:

大概是这样的吧?

function sleeper(ms) {
  var r;

  var p = new Promise(resolve => {
    r = resolve;
    setTimeout(resolve, ms);
  });

  return {
    skip: r,
    promise: p
  };
}

var s = sleeper(10000);

s.promise.then(() => {
  console.log('Promise finished!');
});

console.log('Waiting for 10 seconds... Click the button to skip the wait.');

document.getElementById('skip').addEventListener('click', s.skip);
<input type="button" id="skip" value="Skip delay" />

【讨论】:

  • s2 promise 即使你跳过它也会得到解决,因为你没有取消它的超时
  • @Dabbas 应该已经解决了。我认为这里没有问题。
  • 在之前的代码中(在编辑之前)第二个 promise 调用了,即使我跳过了它并且没有再次调用它。
  • @Dabbas 在我的代码之前的版本中有两个 Promise。这就是解决两个 Promise 的原因。
【解决方案2】:

作为一个想法,也许你可以这样做:

var timeout, myResolver;
function sleep(ms)
{
    return new Promise((resolve) => {
            myResolver = resolve;
            timeout = setTimeout(resolve, ms);
       });
}

sleep(3000).then(function()
{
    // next action
});
function myStopFunction() {
    clearTimeout(timeout);
    myResolver();
}

【讨论】:

    猜你喜欢
    • 2014-10-10
    • 2019-04-21
    • 2017-10-06
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2013-01-09
    • 1970-01-01
    • 2017-01-14
    相关资源
    最近更新 更多