Skip to content

Instantly share code, notes, and snippets.

@shirakaba
Last active June 15, 2018 09:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save shirakaba/44d78add58cc4ffb6acd78f90073b4df to your computer and use it in GitHub Desktop.
Save shirakaba/44d78add58cc4ffb6acd78f90073b4df to your computer and use it in GitHub Desktop.
Advanced Promise patterns

Passing resolve/reject handlers on to event listeners

import * as cp from "child_process";

function promisifiedSpawn(cmd, spawnArgsArray){
  return new Promise((resolve, reject) => {
    const cp = cp.spawn(cmd, spawnArgsArray);
    cp.on("exit", onExit.bind(this, resolve, reject));
  }
}

function onExit(resolve, reject, code, signal){
  if(code === 0 && signal === null){
    return resolve();
  } else {
    return reject(new Error(`Child process exited unexpectedly with code ${code} and signal ${signal}`));
  }
}

promisifiedSpawn("/usr/bin/some_program", ["one", "two"])
.then(() => console.log(`Child process exited healthily!`))
.catch(console.error);

Recursive (retrying) Promise

function slowlyIncrement(num, target){
  return new Promise((resolve, reject) => {
    num++;
    if(num < target){
      setTimeout(() =>{
        resolve(slowlyIncrement(num, target));
      }, 100);
    } else {
      resolve();
    }
  });
}

Reducer

From https://gist.github.com/anvk/5602ec398e4fdc521e2bf9940fd90f84

[1,2,3].reduce((promise,item) => {
	return promise.then(() => { 
		return new Promise((resolve, reject)=> {
			resolve(item);
		})
	})
}, Promise.resolve())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment