You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

30 lines
681 B
JavaScript

"use strict";
module.exports = function createPromiseListener() {
let listeners = [];
function consumeListeners() {
/* To ensure that a resolve/reject is atomic, and can never apply to the same listener queue twice. */
let consumedListeners = listeners;
listeners = [];
return consumedListeners;
}
return {
listen: function () {
return new Promise((resolve, reject) => {
listeners.push({ resolve, reject });
});
},
resolve: function (value) {
consumeListeners().forEach((listener) => {
listener.resolve(value);
});
},
reject: function (value) {
consumeListeners().forEach((listener) => {
listener.reject(value);
});
},
}
};