The Napi::AsyncWorker class may not be appropriate for every
scenario. When using any other async mechanism, introducing a new class
Napi::AsyncContext
is necessary to ensure an async operation is properly
tracked by the runtime. The Napi::AsyncContext
class can be passed to
Napi::Function::MakeCallback() method to properly restore the
correct async execution context.
Creates a new Napi::AsyncContext
.
explicit Napi::AsyncContext::AsyncContext(napi_env env, const char* resource_name);
[in] env
: The environment in which to create the Napi::AsyncContext
.[in] resource_name
: Null-terminated strings that represents the
identifier for the kind of resource that is being provided for diagnostic
information exposed by the async_hooks
API.Creates a new Napi::AsyncContext
.
explicit Napi::AsyncContext::AsyncContext(napi_env env, const char* resource_name, const Napi::Object& resource);
[in] env
: The environment in which to create the Napi::AsyncContext
.[in] resource_name
: Null-terminated strings that represents the
identifier for the kind of resource that is being provided for diagnostic
information exposed by the async_hooks
API.[in] resource
: Object associated with the asynchronous operation that
will be passed to possible async_hooks
.The Napi::AsyncContext
to be destroyed.
virtual Napi::AsyncContext::~AsyncContext();
Napi::AsyncContext::operator napi_async_context() const;
Returns the N-API napi_async_context
wrapped by the Napi::AsyncContext
object. This can be used to mix usage of the C N-API and node-addon-api.
#include "napi.h"
void MakeCallbackWithAsyncContext(const Napi::CallbackInfo& info) {
Napi::Function callback = info[0].As<Napi::Function>();
Napi::Object resource = info[1].As<Napi::Object>();
// Creat a new async context instance.
Napi::AsyncContext context(info.Env(), "async_context_test", resource);
// Invoke the callback with the async context instance.
callback.MakeCallback(Napi::Object::New(info.Env()),
std::initializer_list<napi_value>{}, context);
// The async context instance is automatically destroyed here because it's
// block-scope like `Napi::HandleScope`.
}