2016-11-09 137 views
0

当前我正在使用脚本为我的函数设置超时3秒,然后执行下一个操作。js Promise,取消超时

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

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

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

+0

你用承诺这有什么特别的原因吗?承诺是伟大的,但它们不可取消。 'setTimeout'返回一个ID,您可以使用它来取消即将进行的函数调用。 –

+0

您需要清除超时然后调用解析器,如果你想或继续前进。 – Dabbas

回答

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" />

+0

s2承诺即使因为没有取消超时而跳过它,也会得到解决 – Dabbas

+0

@Dabbas它应该被解决。我认为这里没有问题。 – JLRishe

+0

在前面的代码中(在编辑之前)第二个承诺,即使我跳过它,并没有再次调用它。 – Dabbas

0

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

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(); 
}