Right, the proposals went beyond that. In this context though I thought T.J. was looking for a control surface in promises. I shouldn't assume.

In any case, the original challenge here seems solved by something like:

```javascript

var wait = ms => new Promise(resolve => setTimeout(resolve, ms));

async function consumeReadableStream(stream) {

  async function read() {
    try {
      for await (const chunk of stream) {
        // do work
      }
    } catch (e) {
      if (e.name != "AbortError") throw e;
    }
  }
  await Promise.race([read(), wait(30000).then(() => stream.destroy())]);
}

```

...assuming .destroy() is overloaded to throw AbortError somehow, a detail IMHO. But aren't we digressing?

For me, for-await still seems like a useful paradigm, and I'm not sure readability is helped by using linear code to represent non-linear code flow.

.: Jan-Ivar :.

On 8/1/17 4:29 PM, Domenic Denicola wrote:
That is not why.


------------------------------------------------------------------------
*From:* Jan-Ivar Bruaroey <[email protected]>
*Sent:* Aug 1, 2017 3:47 PM
*To:* [email protected]
*Subject:* Re: Stream + async await

Because a promise is not a control surface of the asynchronous action fulfilling it; confuses owner with consumer. https://stackoverflow.com/a/41417429/918910

.: Jan-Ivar :.

On 7/31/17 7:35 AM, T.J. Crowder wrote:
Related: https://esdiscuss.org/topic/how-about-awaiting-arrays <https://esdiscuss.org/topic/how-about-awaiting-arrays> (particularly the discussion of `await.race`), since effectively you're doing a race between a timeout and each chunk. Also relevant is the former work on cancelling promises, now withdrawn. (Can anyone point me at *why* it was withdrawn?)

-- T.J. Crowder

On Mon, Jul 31, 2017 at 6:10 AM, kai zhu <[email protected] <mailto:[email protected]>> wrote:

    the timeout handler will not work as advertised, e.g. what if io
    / db issues causes a network stream to intermittently respond in
    intervals far greater than 30000ms or not at all?

    > On Jul 31, 2017, at 7:26 AM, James Browning
    <[email protected] <mailto:[email protected]>> wrote:
    >
    > It'll look something like this:
    >
    > ```javascript
    >
    > async function consumeReadableStream(stream) {
    >     const start = Date.now()
    >     for await (const chunk of stream) {
    >
    >        /* Do whatever you want with the chunk here e,g, await other
    > async tasks with chunks
    >            send them off to wherever, etc
    >        */
    >
    >         if (Date.now() - start > 30000) {
    >             throw new Error('30000 ms timeout')
    >        }
    >    }
    >    /* Instead of callbackOnce the returned promise from this
    function
    > itself can be used */
    > }
    >
    > ```
    > _______________________________________________
    > es-discuss mailing list
    > [email protected] <mailto:[email protected]>
    > https://mail.mozilla.org/listinfo/es-discuss
    <https://mail.mozilla.org/listinfo/es-discuss>

    _______________________________________________
    es-discuss mailing list
    [email protected] <mailto:[email protected]>
    https://mail.mozilla.org/listinfo/es-discuss
    <https://mail.mozilla.org/listinfo/es-discuss>




_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss


--
.: Jan-Ivar :.
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to