using_statement
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()
, orunsubscribe()
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";
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
- C#'s using statement.
- My old gist here.
- ECMAScript using statement proposal.