X Tutup
The Wayback Machine - https://web.archive.org/web/20210828214414/https://github.com/nodejs/node/commit/324a6c235a
Skip to content
Permalink
Browse files
async_hooks: add thisArg to AsyncResource.bind
Semver-major

Support setting the `thisArg` for AsyncResource.bind and
AsyncResource.prototype.bind. If `thisArg` is not set,
then `this` will be set to the `AsyncResource` instance.

Fixes: #36051
Signed-off-by: James M Snell <jasnell@gmail.com>

PR-URL: #36782
Reviewed-By: Juan José Arboleda <soyjuanarbol@gmail.com>
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Reviewed-By: Michaël Zasso <targos@protonmail.com>
Reviewed-By: Gerhard Stöbich <deb2001-github@yahoo.de>
  • Loading branch information
jasnell committed Jan 9, 2021
1 parent 7dea99b commit 324a6c235a5bfcbcd7cc7491d55461915c10af34
Showing with 37 additions and 6 deletions.
  1. +12 −2 doc/api/async_hooks.md
  2. +9 −4 lib/async_hooks.js
  3. +16 −0 test/parallel/test-asyncresource-bind.js
@@ -730,30 +730,40 @@ class DBQuery extends AsyncResource {
}
```

#### Static method: `AsyncResource.bind(fn[, type])`
#### Static method: `AsyncResource.bind(fn[, type, [thisArg]])`
<!-- YAML
added:
- v14.8.0
- v12.19.0
changes:
- version: REPLACEME
pr-url: https://github.com/nodejs/node/pull/36782
description: Added optional thisArg.
-->

* `fn` {Function} The function to bind to the current execution context.
* `type` {string} An optional name to associate with the underlying
`AsyncResource`.
* `thisArg` {any}

Binds the given function to the current execution context.

The returned function will have an `asyncResource` property referencing
the `AsyncResource` to which the function is bound.

#### `asyncResource.bind(fn)`
#### `asyncResource.bind(fn[, thisArg])`
<!-- YAML
added:
- v14.8.0
- v12.19.0
changes:
- version: REPLACEME
pr-url: https://github.com/nodejs/node/pull/36782
description: Added optional thisArg.
-->

* `fn` {Function} The function to bind to the current `AsyncResource`.
* `thisArg` {any}

Binds the given function to execute to this `AsyncResource`'s scope.

@@ -220,10 +220,15 @@ class AsyncResource {
return this[trigger_async_id_symbol];
}

bind(fn) {
bind(fn, thisArg = this) {
if (typeof fn !== 'function')
throw new ERR_INVALID_ARG_TYPE('fn', 'Function', fn);
const ret = FunctionPrototypeBind(this.runInAsyncScope, this, fn);
const ret =
FunctionPrototypeBind(
this.runInAsyncScope,
this,
fn,
thisArg);
ObjectDefineProperties(ret, {
'length': {
configurable: true,
@@ -241,9 +246,9 @@ class AsyncResource {
return ret;
}

static bind(fn, type) {
static bind(fn, type, thisArg) {
type = type || fn.name;
return (new AsyncResource(type || 'bound-anonymous-fn')).bind(fn);
return (new AsyncResource(type || 'bound-anonymous-fn')).bind(fn, thisArg);
}
}

@@ -33,3 +33,19 @@ setImmediate(() => {
assert.strictEqual(asyncResource.asyncId(), fn2());
assert.notStrictEqual(asyncId, fn2());
});

const foo = {};
const fn3 = asyncResource.bind(common.mustCall(function() {
assert.strictEqual(this, foo);
}), foo);
fn3();

const fn4 = asyncResource.bind(common.mustCall(function() {
assert.strictEqual(this, asyncResource);
}));
fn4();

const fn5 = asyncResource.bind(common.mustCall(function() {
assert.strictEqual(this, false);
}), false);
fn5();

0 comments on commit 324a6c2

Please sign in to comment.
X Tutup