mirror of
https://github.com/zebrajr/node.git
synced 2026-01-15 12:15:26 +00:00
src, lib: return promises from link
Returns the promises created by link so that they can be awaited to get rid of race conditions while resolving and loading modules. PR-URL: https://github.com/nodejs/node/pull/18394 Reviewed-By: Tiancheng "Timothy" Gu <timothygu99@gmail.com>
This commit is contained in:
committed by
Ruben Bridgewater
parent
3cd7977a42
commit
edbcf7c844
@@ -6,9 +6,6 @@ const { decorateErrorStack } = require('internal/util');
|
||||
const assert = require('assert');
|
||||
const resolvedPromise = SafePromise.resolve();
|
||||
|
||||
const enableDebug = (process.env.NODE_DEBUG || '').match(/\besm\b/) ||
|
||||
process.features.debug;
|
||||
|
||||
/* A ModuleJob tracks the loading of a single Module, and the ModuleJobs of
|
||||
* its dependencies, over time. */
|
||||
class ModuleJob {
|
||||
@@ -27,7 +24,6 @@ class ModuleJob {
|
||||
|
||||
// Wait for the ModuleWrap instance being linked with all dependencies.
|
||||
const link = async () => {
|
||||
const dependencyJobs = [];
|
||||
({ module: this.module,
|
||||
reflect: this.reflect } = await this.modulePromise);
|
||||
if (inspectBrk) {
|
||||
@@ -35,17 +31,17 @@ class ModuleJob {
|
||||
initWrapper(this.module.instantiate, this.module);
|
||||
}
|
||||
assert(this.module instanceof ModuleWrap);
|
||||
this.module.link(async (dependencySpecifier) => {
|
||||
const dependencyJobPromise =
|
||||
this.loader.getModuleJob(dependencySpecifier, url);
|
||||
dependencyJobs.push(dependencyJobPromise);
|
||||
const dependencyJob = await dependencyJobPromise;
|
||||
return (await dependencyJob.modulePromise).module;
|
||||
|
||||
const dependencyJobs = [];
|
||||
const promises = this.module.link(async (specifier) => {
|
||||
const jobPromise = this.loader.getModuleJob(specifier, url);
|
||||
dependencyJobs.push(jobPromise);
|
||||
return (await (await jobPromise).modulePromise).module;
|
||||
});
|
||||
if (enableDebug) {
|
||||
// Make sure all dependencies are entered into the list synchronously.
|
||||
Object.freeze(dependencyJobs);
|
||||
}
|
||||
|
||||
if (promises !== undefined)
|
||||
await SafePromise.all(promises);
|
||||
|
||||
return SafePromise.all(dependencyJobs);
|
||||
};
|
||||
// Promise for the list of all dependencyJobs.
|
||||
|
||||
@@ -171,6 +171,9 @@ void ModuleWrap::Link(const FunctionCallbackInfo<Value>& args) {
|
||||
Local<Context> mod_context = obj->context_.Get(isolate);
|
||||
Local<Module> module = obj->module_.Get(isolate);
|
||||
|
||||
Local<Array> promises = Array::New(isolate,
|
||||
module->GetModuleRequestsLength());
|
||||
|
||||
// call the dependency resolve callbacks
|
||||
for (int i = 0; i < module->GetModuleRequestsLength(); i++) {
|
||||
Local<String> specifier = module->GetModuleRequest(i);
|
||||
@@ -193,9 +196,11 @@ void ModuleWrap::Link(const FunctionCallbackInfo<Value>& args) {
|
||||
}
|
||||
Local<Promise> resolve_promise = resolve_return_value.As<Promise>();
|
||||
obj->resolve_cache_[specifier_std].Reset(env->isolate(), resolve_promise);
|
||||
|
||||
promises->Set(mod_context, specifier, resolve_promise).FromJust();
|
||||
}
|
||||
|
||||
args.GetReturnValue().Set(that);
|
||||
args.GetReturnValue().Set(promises);
|
||||
}
|
||||
|
||||
void ModuleWrap::Instantiate(const FunctionCallbackInfo<Value>& args) {
|
||||
|
||||
Reference in New Issue
Block a user