Skip to content

Extension ResolveFieldFinishFunc executed before resolver runs value function #483

@benmai

Description

@benmai

When using an extension with a schema which has a resolver that returns a function value, e.g.

func(p graphql.ResolveParams) (interface{}, error) {
        return func() (interface{}, error) {
                return "hello", nil
        }, nil
}

the ResolveFieldFinishFunc (as registered by the ResolveFieldDidStart method on the extension) is called before the function value is executed. If I'm reading the source correctly below for resolveField, resolveFieldFinishFn is called immediately after the resolveFn, but before completeValueCatchingError actually evaluates the resolver value if it is a function.

graphql/executor.go

Lines 657 to 663 in bed865f

extErrs = resolveFieldFinishFn(result, resolveFnError)
if len(extErrs) != 0 {
eCtx.Errors = append(eCtx.Errors, extErrs...)
}
completed := completeValueCatchingError(eCtx, returnType, fieldASTs, info, path, result)
return completed, resultState

Is there a reason for this? Since the Extension interface was created in part to support tracing use cases as per #448, that we would want to only run the ResolveFieldFinishFunc after the resolver value is fully evaluated.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions