title: Why is this lazy iterable resolving more than once?
body: <p>I ran into this with some production code today and was able to fix it with a simple <code>.toList()</code> to resolve the lazyList before waiting, but I don't understand WHY it works this way and <em>only</em> when using <code>Future.wait()</code> what's going on here? Why is the lazyList being resolved twice?</p>
  
  <p><a href="https://dartpad.dartlang.org/6bdf91b6ed90bec353845c0a4a11bdc4" rel="nofollow noreferrer">Play with it on DartPad</a> (change the value of <code>doWait</code> on line 3 and see the different results)</p>
  
  <hr>
  
  <h3>Code</h3>
  
  <pre class="lang-dart prettyprint-override"><code>import 'dart:async';
  
  void main() {
    var executedTracker  = [];
    var source           = ["a", "b", "c"];
  
    List promises = source.map((item) async {
      print('executing item $item${(executedTracker.contains(item) ? ' (again!? o_O)' : '')}'); executedTracker.add(item);
      return (item*2);
    });
  
    Future.wait(promises).whenComplete(() {
      print('--------\nAll promises complete.');
      print('Processing ${promises.length} results...\n');
      promises.forEach((promise) =&gt; null /* do a thing with the result*/);
    });
  }
  </code></pre>
  
  <h3>Output</h3>
  
  <pre class="lang-none prettyprint-override"><code>executing item a
  executing item b
  executing item c
  
  All promises complete.
  Processing 3 results...
  
  executing item a (again!? o_O)
  executing item b (again!? o_O)
  executing item c (again!? o_O)
  </code></pre>