如何解决在socket-io事件上拒绝承诺并停止超时
我当前正在使用以下函数在Node.js服务器脚本中模拟等待(睡眠)。
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve,ms));
}
我正在像下面那样使用它。以这种方式使用时,该行下面的代码将暂停执行,直到经过20秒为止。
await sleep(20000)
现在,我想在socket-io事件上打破这种睡眠状态,但我找不到正确的解决方法。
我尝试了以下代码,但并没有破坏睡眠。
// This object holds some properties
var meetings = {
}
function sleep(ms) {
return new Promise(function(resolve,reject) => {
var t = setTimeout(resolve,ms)
// add the function as a "meetings" object property value
meetings[endSleep] = function(){
clearTimeout(t)
reject()
}
});
}
// later,using socket-io
socket.on("end_sleep",function(){
meetings["endSleep"]()
})
我如何才能使用此功能?所有有用的建议都将受到高度赞赏。
解决方法
我很想将其包装在一个类中,该类同时包含timerId和返回的reject
的{{1}}的状态,并在Promise
方法中使用它们。
下面展示了这一点:
cancel
class Sleeper
{
wait(ms){
return new Promise( (resolve,reject) => {
this.reject = reject;
this.t = setTimeout(resolve,ms);
});
}
cancel(reason){
clearTimeout(this.t);
this.reject(reason);
}
}
var sleep = new Sleeper();
async function test(){
try{
await sleep.wait(5000);
console.log("finished");
}catch(e){
console.log("cancelled:",e);
}
}
document.querySelector("#cancel").addEventListener("click",() => {
sleep.cancel("cancel button pressed");
});
test();
我添加了传递取消原因的功能,可能会有用。
在您的代码中,如下所示:
<button id="cancel">Cancel</button>
,
在您的情况下,“中断”表示“及早解决”,而不是拒绝。如果调用拒绝,则await语句将引发错误,并且可以停止执行异步函数(如果未使用try catch块)。 该代码可能看起来更好一些::
const abortController= new CPromise.AbortController();
(async()=>{
await sleep(30000,abortController.signal);
})();
socket.on("end_sleep",function(){
abortController.abort();
});
或
ReinforcementLearningEstimator
,
我不太确定为什么会这样,但我想记下是什么使它起作用。
当我使用resolve
而不是reject
时,一切都解决了。
function sleep(ms) {
return new Promise(function(resolve,reject) => {
var t = setTimeout(resolve,ms)
// add the function as a "meetings" object property value
meetings[endSleep] = function(){
clearTimeout(t)
resolve()
}
});
}
如果有人可以解释为什么这样做会如此,请随时编辑此答案。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。