Skip to content

Instantly share code, notes, and snippets.

@jooyunghan
Created March 10, 2016 17:27
Show Gist options
  • Save jooyunghan/622dc4186f734f0bae6c to your computer and use it in GitHub Desktop.
Save jooyunghan/622dc4186f734f0bae6c to your computer and use it in GitHub Desktop.
Make a promise-returning function as non-overlapping one.
process.on('message', function(message) {
console.log("message received", message);
process.send(message.toUpperCase(), function(err) {
console.log("replied");
});
});
var cp = require('child_process');
var child = cp.fork('child.js');
function send(...msg) {
return new Promise((res, rej) => {
child.send(msg.join(""), (err) => {
if (err) rej(err);
else res();
});
});
}
function recv() {
return new Promise((res, rej) => {
child.once('message', (message) => {
res(message);
})
});
}
function atomic(inner) {
var obj = {};
return (...args) => new Promise((resolve, reject) => {
const transact = () => {
obj.locked = true; // take this chance
inner(...args)
.then(resolve, reject)
.then(() => {
obj.locked = false; // release
});
};
if (obj.locked) {
var observer = () => {
if (obj.locked)
return; // wakeup later, then wait for next chance
else {
Object.unobserve(obj, observer);
transact();
}
};
Object.observe(obj, observer);
} else {
transact();
}
});
}
const write = atomic((...msg) => send(...msg).then(recv));
Promise.all([write("abc", "def"), write("def"), write("ghi")])
.then(result => console.log(result))
.then(() => console.log("done"))
.then(() => child.kill())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment