using_statement

npm version CI deno doc

Function call that acts like a using statement.

With Deno:

import { using } from "https://deno.land/x/using_statement/mod.ts";

Or with Node:

npm install --save using-statement

Example

Before:

const camera = new Camera();
try {
  outputPicture(camera.takePictureSync());
} finally {
  camera.dispose();
}

After:

import { using } from "https://deno.land/x/using_statement/mod.ts";

using(new Camera(), (camera) => {
  outputPicture(camera.takePictureSync());
});

Features

  • Supports synchronous, asynchronous, and generator functions.
  • Handles exceptions to ensure the resource is properly disposed.
  • Accepts objects with a #dispose(), #close(), or #unsubscribe() method.
  • Allows asynchronously disposing when using a synchronous or asynchronous function.

Examples

Setup:

// Camera.ts
export class Camera {
  takePictureSync() {
    // ...etc...
    return pictureData;
  }

  async takePicture() {
    // ...etc...
    return pictureData;
  }

  dispose() {
    // clean up the resource this class is holding
  }
}

Synchronous example:

import { using } from "https://deno.land/x/using_statement/mod.ts";
import { Camera } from "./Camera.ts";

using(new Camera(), (camera) => {
  const picture = camera.takePictureSync();
  outputPicture(picture); // some function that outputs the picture
});

// camera is disposed here

Asynchronous example:

import { using } from "https://deno.land/x/using_statement/mod.ts";
import { Camera } from "./Camera.ts";

(async () => {
  await using(new Camera(), async (camera) => {
    const picture = await camera.takePicture();
    outputPicture(picture);
  });

  // camera is disposed here
})();

Generator function example:

import { using } from "https://deno.land/x/using_statement/mod.ts";
import { Camera } from "./Camera.ts";

const picturesIterator = using(new Camera(), function* (camera) {
  for (let i = 0; i < 10; i++) {
    yield camera.takePictureSync();
  }
});

// camera is not disposed yet...

for (const picture of picturesIterator) {
  outputPicture(picture);
}

// camera is now disposed

Inspiration