Stream + async await
Jan-Ivar Bruaroey
jib at mozilla.com
Thu Aug 3 01:45:30 UTC 2017
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 <jib at mozilla.com>
> *Sent:* Aug 1, 2017 3:47 PM
> *To:* es-discuss at mozilla.org
> *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 <kaizhu256 at gmail.com
>> <mailto:kaizhu256 at gmail.com>> 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
>> <thejamesernator at gmail.com <mailto:thejamesernator at gmail.com>> 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
>> > es-discuss at mozilla.org <mailto:es-discuss at mozilla.org>
>> > https://mail.mozilla.org/listinfo/es-discuss
>> <https://mail.mozilla.org/listinfo/es-discuss>
>>
>> _______________________________________________
>> es-discuss mailing list
>> es-discuss at mozilla.org <mailto:es-discuss at mozilla.org>
>> https://mail.mozilla.org/listinfo/es-discuss
>> <https://mail.mozilla.org/listinfo/es-discuss>
>>
>>
>>
>>
>> _______________________________________________
>> es-discuss mailing list
>> es-discuss at mozilla.org
>> https://mail.mozilla.org/listinfo/es-discuss
>
>
> --
> .: Jan-Ivar :.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20170802/f50468e1/attachment.html>
More information about the es-discuss
mailing list