Skip to content

Instantly share code, notes, and snippets.

@SparK-Cruz
Last active July 26, 2022 14:14
Show Gist options
  • Save SparK-Cruz/381012bbb675aeb31114f70490f48092 to your computer and use it in GitHub Desktop.
Save SparK-Cruz/381012bbb675aeb31114f70490f48092 to your computer and use it in GitHub Desktop.
Deferrence in JavaScript
(function(){
module.exports = function scope(block) {
const deferred = [];
const defer = function(callback, args) {
deferred.unshift({target: this, callback, args});
}
try {
return block(defer);
} finally {
deferred.forEach(o => o.callback.apply(o.target, o.args));
}
}
})();
const scope = require('./scope.js');
const fakeDb = {
openned: false,
open: function() { console.log('openned'); this.openned = true; },
close: function() { console.log('closed'); this.openned = false; },
};
const fakeModel = {
save: (db) => db.openned ? 'working with DB' : 'failed!',
}
const fakeSocket = {
connect: () => console.log('connected'),
disconnect: () => console.log('disconnected'),
}
scope(function(defer){
fakeDb.open();
defer(fakeDb.close, []);
fakeSocket.connect();
defer(fakeSocket.disconnect, []);
console.log('do something with DB and Socket');
console.log(fakeModel.save(fakeDb));
});
// openned
// connected
// do something with DB and Socket
// working with DB
// disconnected
// closed
@SparK-Cruz
Copy link
Author

This is made for "synchronous-like" code, ideal to use with async/await but not with callbacks.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment