Skip to content

Instantly share code, notes, and snippets.

View domenic's full-sized avatar

Domenic Denicola domenic

View GitHub Profile
@domenic
domenic / last-with-cancel.js
Created June 8, 2016 23:31
"last" with cancelation
"use strict";
var pending = { then: function () {} };
// operation must accept as its first argument a cancel token
// if your operation does not support cancelation, use a shim:
// last((_, ...args) => realOp(...args));
module.exports = operation => {
let latestPromise = null;
let previousCancel = null;
@domenic
domenic / dot-promise-is-for-adapting-old-apis.js
Last active May 22, 2016 15:59
Cancel token discussion points
function xhrAdapted(url, { cancelToken } = {}) {
const xhr = new XMLHttpRequest();
return new Promise((resolve, reject, cancel) => {
xhr.addEventListener("load", () => resolve(xhr.responseText));
xhr.addEventListener("error", () => reject(new Error("could not XHR")));
if (!cancelToken) return;
cancelToken.promise.then(reason => {
cancel(reason);
xhr.abort();
@domenic
domenic / catch-cancel.sjs
Last active May 18, 2016 21:00
catch cancel
// This does not work at all, for unknown reasons:
let catch = macro {
case {
try {
$tryBody ...
} $name ($exception:ident) {
$catchBody ...
}
} => {
return #{
@domenic
domenic / 1-DOMPointReadOnly.idl
Created February 29, 2016 12:34
webidl2js DOMPoint example
[Constructor(optional unrestricted double x = 0, optional unrestricted double y = 0,
optional unrestricted double z = 0, optional unrestricted double w = 1),
Exposed=(Window,Worker)]
interface DOMPointReadOnly {
[NewObject] static DOMPointReadOnly fromPoint(optional DOMPointInit other);
readonly attribute unrestricted double x;
readonly attribute unrestricted double y;
readonly attribute unrestricted double z;
readonly attribute unrestricted double w;
@domenic
domenic / 1-CharacterData.webidl
Last active September 9, 2020 22:16
webidl2js example
[Exposed=Window]
interface CharacterData : Node {
attribute [TreatNullAs=EmptyString] DOMString data;
readonly attribute unsigned long length;
DOMString substringData(unsigned long offset, unsigned long count);
void appendData(DOMString data);
void insertData(unsigned long offset, DOMString data);
void deleteData(unsigned long offset, unsigned long count);
void replaceData(unsigned long offset, unsigned long count, DOMString data);
};
@domenic
domenic / vscode.md
Created February 17, 2016 17:59
VS Code wishlist
@domenic
domenic / execution-order.md
Last active February 7, 2016 21:30
Execution order is broken by proposed module changes
// es6a.js

await foo(); // takes 10 milliseconds

require('./y.js');
// es6b.js
@domenic
domenic / 0-usage.js
Last active August 21, 2023 09:02
Import module function (assuming <script type="module"> is implemented)
// Dynamic module loading using runtime-composed strings, decisions, etc.
for (const m of ["cool", "awesome", "fun", "whee"]) {
if (Math.random() > 0.5) {
importModule(`/js/${m}.js`).then(
module => console.log("Module instance object for " + m, module),
e => console.error(e)
);
}
}
@domenic
domenic / angularpromise.js
Created January 21, 2016 23:28
How to subclass a promise
// ES6
class AngularPromise extends Promise {
constructor(executor) {
super((resolve, reject) => {
// before
return executor(resolve, reject);
});
// after
}
@domenic
domenic / not-bad-code.js
Last active July 4, 2020 09:07
Avoiding explicit promise construction antipattern
function getUserDetail(username) {
if (userCache[username]) {
return Promise.resolve(userCache[username]);
}
// Use the fetch API to get the information
return fetch('users/' + username + '.json')
.then(function(result) {
userCache[username] = result;
return result;