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
30 lines
681 B
JavaScript
3 years ago
|
"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);
|
||
|
});
|
||
|
},
|
||
|
}
|
||
|
};
|