I'm currently using the following function to simulate awaiting (sleep) in my Node.js server script.
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
and I'm using it like below. When used in this way, executing the code below that line is paused until 20 seconds have been passed.
await sleep(20000)
Now I want to break this sleeping on a socket-io event, but I can't figure a correct way out to do that.
I tried the following code, but it didn't break the sleep.
// 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"]()
})
How can I get this functionality to work? all helpful suggestions are highly appreciated.
In your case 'break' means 'early resolving', not rejecting. If you calling reject the await statement will throw an error and execution of the async function can be stopped (if try catch block is not used). The code might look a little better::
const CPromise= require("c-promise2");
// cancellable sleep
function sleep(ms, signal) {
return new CPromise((resolve, reject, {onCancel}) => {
const timer = setTimeout(resolve, ms);
onCancel(() => clearTimeout(timer));
}, {signal}).catch(() => {});
}
(async()=>{
const sleeper= sleep(30000);
socket.on("end_sleep",function(){
sleeper.cancel();
});
await sleeper;
})();
or
const abortController= new CPromise.AbortController();
(async()=>{
await sleep(30000, abortController.signal);
})();
socket.on("end_sleep",function(){
abortController.abort();
});