title: How to properly abort a node.js promise chain using Q?
body: <p>I'm using <a href="https://github.com/kriskowal/q/">the Q module</a> for Node.js in attempts to avoid the "pyramid of doom" in scenarios where I have many steps. For example:</p>
  
  <pre><code>function doTask(task, callback)
  {
      Q.ncall(task.step1, task)
      .then(function(result1){
          return Q.ncall(task.step2, task);
      })
      .then(function(result2){
          return Q.ncall(task.step3, task);
      })
      .fail(callback).end();
  }
  </code></pre>
  
  <p>Essentially this seems to work; if an error is thrown by any of the task steps, it is passed to the callback (though I would be welcome to improvements, as I am new to node.js promises). However, I have a problem when I need to abort the task-chain early. For example, if result1 is successfully returned I might want to call the callback early and abort the rest, but my attempts to do so are failing...</p>
  
  <pre><code>function doTask(task, callback)
  {
      Q.ncall(task.step1, task)
      .then(function(result1){
          if(result1)
          {// the rest of the task chain is unnecessary 
              console.log('aborting!');
              callback(null, result1);
              return null;
          }
          return Q.ncall(task.step2, task);
      })
      .then(function(result2){
          console.log('doing step 3...');
          return Q.ncall(task.step3, task);
      })
      .fail(callback).end();
  }
  </code></pre>
  
  <p>In this example, I see both "aborting!" and "doing step 3..." printed.</p>
  
  <p>I'm sure I'm merely misunderstanding some basic principles here, so would appreciate any help. Thanks!</p>