title: Why graphql-js executor stops resolving child fields that have their own resolvers when the parent resolver return null/undefined?
body: <p>While writing a lib for GraphQL in JavaScript I stumbled upon a curious behavior. I managed to isolate it in a very simple example. Let's take this server snippet:</p>
  
  <pre class="lang-js prettyprint-override"><code>
      const { ApolloServer, gql } = require("apollo-server")
  
      const typeDefs = gql`
        type Book {
          resolveItSelf: String
        }
  
        type Query {
          book: Book
        }
      `
  
      const resolvers = {
        Query: {
          book: () =&gt; {
            return null // same behavior with undefined here
          }
        },
        Book: {
          resolveItSelf: () =&gt; "resolveItSelf"
        }
      }
  
      const server = new ApolloServer({ typeDefs, resolvers })
  
      server.listen().then(({ url }) =&gt; {
        console.log(`  Server ready at ${url}`)
      })
  </code></pre>
  
  <p>If we query this server with the following query:</p>
  
  <pre class="lang-js prettyprint-override"><code>    {
        book {
          resolveItSelf   
        }
      }
  </code></pre>
  
  <p>We get this result:</p>
  
  <pre class="lang-js prettyprint-override"><code>{
    "data": {
      "book": null
    }
  }
  </code></pre>
  
  <p>So, I was expecting the graphql executor to try to resolve the "resolveItSelf" field (which have its own resolver) even if the book resolver returned null.</p>
  
  <p>A way to get the behavior I expect is to change the book's resolver a little bit:</p>
  
  <pre class="lang-js prettyprint-override"><code>const resolvers = {
    Query: {
      book: () =&gt; {
        return {} // empty object instead of null/undefined
      }
    },
    Book: {
      resolveItSelf: () =&gt; "resolveItSelf"
    }
  }
  </code></pre>
  
  <p>Then we get this result:</p>
  
  <pre class="lang-js prettyprint-override"><code>{
    "data": {
      "book": {
        "resolveItSelf": "resolveItSelf"
      }
    }
  }
  </code></pre>
  
  <p>The field is resolved even if the parent is empty !</p>
  
  <p>So my question is why the graphql-js executor stop trying to resolve fields if the parent's resolver return null/undefined, even though requested fields can be resolved on their own ? (Is there a section in the draft that cover this ?)</p>