Документация Запланировать пилот

AsyncLocalStorage

Контекст

Cloudflare Workers предоставляет реализацию подмножества Node.js AsyncLocalStorage ↗ API для создания хранилищ в памяти, которые остаются согласованными при выполнении асинхронных операций.

Конструктор

import { AsyncLocalStorage } from "node:async_hooks";

const asyncLocalStorage = new AsyncLocalStorage();

Методы

Статические методы

Примеры

Слушатель событий fetch

import { AsyncLocalStorage } from 'node:async_hooks';

const asyncLocalStorage = new AsyncLocalStorage();
let idSeq = 0;

export default {
  async fetch(req) {
    return asyncLocalStorage.run(idSeq++, () => {
      // Simulate some async activity...
      await scheduler.wait(1000);
      return new Response(asyncLocalStorage.getStore());
    });
  }
};

Несколько хранилищ

API поддерживает несколько AsyncLocalStorage экземпляров для одновременного использования.

import { AsyncLocalStorage } from 'node:async_hooks';

const als1 = new AsyncLocalStorage();
const als2 = new AsyncLocalStorage();

export default {
  async fetch(req) {
    return als1.run(123, () => {
      return als2.run(321, () => {
        // Simulate some async activity...
        await scheduler.wait(1000);
        return new Response(`${als1.getStore()}-${als2.getStore()}`);
      });
    });
  }
};

Необработанные отклонения промисов

Когда Promise отклоняется и это отклонение остаётся необработанным, асинхронный контекст передаётся в 'unhandledrejection' обработчик события:

import { AsyncLocalStorage } from "node:async_hooks";

const asyncLocalStorage = new AsyncLocalStorage();
let idSeq = 0;

addEventListener("unhandledrejection", (event) => {
	console.log(asyncLocalStorage.getStore(), "unhandled rejection!");
});

export default {
	async fetch(req) {
		return asyncLocalStorage.run(idSeq++, () => {
			// Cause an unhandled rejection!
			throw new Error("boom");
		});
	},
};

AsyncLocalStorage.bind() и AsyncLocalStorage.snapshot()

import { AsyncLocalStorage } from "node:async_hooks";

const als = new AsyncLocalStorage();

function foo() {
	console.log(als.getStore());
}
function bar() {
	console.log(als.getStore());
}

const oneFoo = als.run(123, () => AsyncLocalStorage.bind(foo));
oneFoo(); // prints 123

const snapshot = als.run("abc", () => AsyncLocalStorage.snapshot());
snapshot(foo); // prints 'abc'
snapshot(bar); // prints 'abc'
import { AsyncLocalStorage } from "node:async_hooks";

const als = new AsyncLocalStorage();

class MyResource {
	#runInAsyncScope = AsyncLocalStorage.snapshot();

	doSomething() {
		this.#runInAsyncScope(() => {
			return als.getStore();
		});
	}
}

const myResource = als.run(123, () => new MyResource());
console.log(myResource.doSomething()); // prints 123

AsyncResource

AsyncResource ↗ класс является частью API отслеживания асинхронного контекста Node.js, который позволяет создавать собственные асинхронные контексты. Объекты, расширяющие AsyncResource способны передавать асинхронный контекст почти так же, как promises.

Обратите внимание, что AsyncLocalStorage.snapshot() и AsyncLocalStorage.bind() предлагают более удачный подход. AsyncResource предоставляется исключительно для обратной совместимости с Node.js.

Конструктор

import { AsyncResource, AsyncLocalStorage } from "node:async_hooks";

const als = new AsyncLocalStorage();

class MyResource extends AsyncResource {
	constructor() {
		// The type string is required by Node.js but unused in Workers.
		super("MyResource");
	}

	doSomething() {
		this.runInAsyncScope(() => {
			return als.getStore();
		});
	}
}

const myResource = als.run(123, () => new MyResource());
console.log(myResource.doSomething()); // prints 123

Методы

Важные замечания

Запросите бесплатный пилот

Запланировать пилот