All Projects → jcoreio → promisify-child-process

jcoreio / promisify-child-process

Licence: MIT license
seriously like the best async child process library

Programming Languages

javascript
184084 projects - #8 most used programming language

Projects that are alternatives of or similar to promisify-child-process

Execa
Process execution for humans
Stars: ✭ 4,318 (+7896.3%)
Mutual labels:  child-process, spawn, exec
apr
this is like caolan/async which is like lodash but async, but awaitful
Stars: ✭ 75 (+38.89%)
Mutual labels:  promises, async-await
shell-exec
Execute a command through the system shell
Stars: ✭ 20 (-62.96%)
Mutual labels:  spawn, exec
Promise Fun
Promise packages, patterns, chat, and tutorials
Stars: ✭ 3,779 (+6898.15%)
Mutual labels:  promises, async-await
await-mutex
Promised based Javascript Mutex
Stars: ✭ 36 (-33.33%)
Mutual labels:  promises, async-await
typescript-async
Creating Asynchronous Code with TypeScript
Stars: ✭ 44 (-18.52%)
Mutual labels:  promises, async-await
Promesa
A promise library for Clojure(Script)
Stars: ✭ 277 (+412.96%)
Mutual labels:  promises, async-await
Async Javascript
Asynchronous Programming in JavaScript
Stars: ✭ 372 (+588.89%)
Mutual labels:  promises, async-await
Swiftcoroutine
Swift coroutines for iOS, macOS and Linux.
Stars: ✭ 690 (+1177.78%)
Mutual labels:  promises, async-await
P Map
Map over promises concurrently
Stars: ✭ 639 (+1083.33%)
Mutual labels:  promises, async-await
Asynquence
Asynchronous flow control (promises, generators, observables, CSP, etc)
Stars: ✭ 1,737 (+3116.67%)
Mutual labels:  promises, async-await
Radon
Object oriented state management solution for front-end development.
Stars: ✭ 80 (+48.15%)
Mutual labels:  promises, async-await
Async Javascript Cheatsheet
Cheatsheet for promises and async/await.
Stars: ✭ 1,902 (+3422.22%)
Mutual labels:  promises, async-await
pyfuseki
A library that uses Python to connect and manipulate Jena Fuseki, which provides sync and async methods.
Stars: ✭ 22 (-59.26%)
Mutual labels:  async-await
node-express-reddit-clone
Build a Node, Express and MySQL-based clone of Reddit for DecodeMTL web development bootcamp
Stars: ✭ 28 (-48.15%)
Mutual labels:  promises
awaitwhat
Await, What?
Stars: ✭ 48 (-11.11%)
Mutual labels:  async-await
Bliss
Blissful JavaScript
Stars: ✭ 2,352 (+4255.56%)
Mutual labels:  promises
market-pricing
Wrapper for the unofficial Steam Market Pricing API
Stars: ✭ 21 (-61.11%)
Mutual labels:  promises
promiviz
Visualize JavaScript Promises on the browser. Visualize the JavaScript Promise APIs and learn. It is a playground to learn about promises faster, ever!
Stars: ✭ 79 (+46.3%)
Mutual labels:  promises
Promisekit
Promises for Swift & ObjC.
Stars: ✭ 13,699 (+25268.52%)
Mutual labels:  promises

promisify-child-process

CircleCI Coverage Status semantic-release Commitizen friendly npm version

seriously like the best async child process library

Based upon child-process-async, but more thorough, because that package doesn't seem very actively maintained.

promisify-child-process provides a drop-in replacement for the original child_process functions, not just duplicate methods that return a Promise. So when you call exec(...) we still return a ChildProcess instance, just with .then(), .catch(), and .finally() added to make it promise-friendly.

Install and Set-up

npm install --save promisify-child-process

If you are using a old version of Node without built-in Promises or Object.create, you will need to use polyfills (e.g. @babel/polyfill).

// OLD:
const { exec, spawn, fork, execFile } = require('child_process')
// NEW:
const { exec, spawn, fork, execFile } = require('promisify-child-process')

Upgrading to v3

You must now pass maxBuffer or encoding to spawn/fork if you want to capture stdout or stderr.

Resolution/Rejection

The child process promise will only resolve if the process exits with a code of 0. If it exits with any other code, is killed by a signal, or emits an 'error' event, the promise will reject.

Capturing output

exec and execFile capture stdout and stderr by default. But spawn and fork don't capture stdout and stderr unless you pass an encoding or maxBuffer option:

const { spawn } = require('promisify-child-process');

async function() {
  // captures output
  const { stdout, stderr } = await spawn('ls', [ '-al' ], {encoding: 'utf8'});
  const { stdout, stderr } = await spawn('ls', [ '-al' ], {maxBuffer: 200 * 1024});

  // BUG, DOESN'T CAPTURE OUTPUT:
  const { stdout, stderr } = await spawn('ls', [ '-al' ]);
}

Additional properties on rejection errors

If the child process promise rejects, the error may have the following additional properties:

  • code - the process' exit code (if it exited)
  • signal - the signal the process was killed with (if it was killed)
  • stdout - the captured stdout (if output capturing was enabled)
  • stderr - the captured stderr (if output capturing was enabled)

Wrapper

If for any reason you need to wrap a ChildProcess you didn't create, you can use the exported promisifyChildProcess function:

const { promisifyChildProcess } = require('promisify-child-process');

async function() {
  const { stdout, stderr } = await promisifyChildProcess(
    some3rdPartyFunctionThatReturnsChildProcess(),
    { encoding: 'utf8' }
  )
}

Examples

exec()

async function() {
  const { stdout, stderr } = await exec('ls -al');
  // OR:
  const child = exec('ls -al', {});
  // do whatever you want with `child` here - it's a ChildProcess instance just
  // with promise-friendly `.then()` & `.catch()` functions added to it!
  child.stdin.write(...);
  child.stdout.pipe(...);
  child.stderr.on('data', (data) => ...);
  const { stdout, stderr } = await child;
}

spawn()

async function() {
  const { stdout, stderr, code } = await spawn('ls', [ '-al' ], {encoding: 'utf8'});
  // OR:
  const child = spawn('ls', [ '-al' ], {});
  // do whatever you want with `child` here - it's a ChildProcess instance just
  // with promise-friendly `.then()` & `.catch()` functions added to it!
  child.stdin.write(...);
  child.stdout.pipe(...);
  child.stderr.on('data', (data) => ...);
  const { stdout, stderr, code } = await child;
}
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].