- From: guest271314 <notifications@github.com>
- Date: Sun, 27 Aug 2017 21:25:59 +0000 (UTC)
- To: whatwg/streams <streams@noreply.github.com>
- Cc: Subscribed <subscribed@noreply.github.com>
- Message-ID: <whatwg/streams/issues/778/325225833@github.com>
@jakearchibald Getting two errors at jsbin `Uncaught SyntaxError: Unexpected token *` when both `async` and `*` are used, and `Uncaught SyntaxError: Unexpected reserved word` at `await` before `for..of` loop at Chromium 60 with `--js-flags=--harmony-async-iteration` flag set. Can you provide link documentations relevant to `--js-flags=--harmony-async-iteration` flag, which does not appear to be listed at [List of Chromium Command Line Switches](https://peter.sh/experiments/chromium-command-line-switches/)? `await` can be used both before `iterable` at `(variable of iterable)` and within `for..of` loop `statement`. If expected result is for iteration to wait for current `Promise` value following `await`. For example ``` // wait for each `iterable` before reaching `statement` (async() => { for (let prop of [await new Promise(resolve => setTimeout(resolve, Math.floor(Math.random() * 10000), 1)), await new Promise(resolve => setTimeout(resolve, Math.floor(Math.random() * 5000), 2))] ) { console.log(prop); }; })(); ``` ``` // use generator function for `iterable` (async(n) => { function* gen() { while(++n < 5) yield new Promise(resolve => setTimeout(resolve, 1000, {value:n, done:false})) } for (let prop of gen()) { console.log(await prop) } })(0); ``` ``` // pass an array of functions to be called within `statement`, // next `iterable` awaits fulfillment of `Promise` following `await` const fn = async(res, ...props) => { for (let prop of props) { res.push(await prop()); console.log(res); }; return res } const arr = [ () => new Promise((resolve, reject) => setTimeout(() => resolve(0) , Math.floor(Math.random() * 2000)) ), () => new Promise((resolve, reject) => setTimeout(() => resolve(1) , Math.floor(Math.random() * 2000)) ) ]; fn([], ...arr) .then(data => console.log("done:", data)) .catch(err => console.error(err)); ``` Adjusted pattern at linked jsbin https://jsbin.com/zusexeripu/edit?js,console to not combine `async` with `*` at function declaration for number example ``` function* asyncRandomNumbers() { // This is a web service that returns a random number const url = 'https://www.random.org/decimal-fractions/?num=1&dec=10&col=1&format=plain&rnd=new'; while(true) yield fetch(url).then(response => response.text()).then(text => Number(text)); } async function example() { for (const p of asyncRandomNumbers()) { const n = await p; if (n > 0.95) { console.log("done", n); break; } else { console.log(n); } } } example(); ``` To iterate a `ReadableStream` we can use several different patterns, depending on expected flow control and result ``` async function readStream() { let n = 0; const rs = new ReadableStream({ pull(c) { if (n++ < 5) { c.enqueue(n) } else { c.close() } } }); const reader = rs.getReader(); const res = []; async function processStream() { return await reader.read(); } function* gen() { while(true) yield processStream() } for (let stream of gen()) { const {value, done} = await stream; if (done) break; res.push(value); console.log(value, done); } return {res, rs, reader, complete: await reader.closed.then(() => true)}; }; ``` -- You are receiving this because you are subscribed to this thread. Reply to this email directly or view it on GitHub: https://github.com/whatwg/streams/issues/778#issuecomment-325225833
Received on Sunday, 27 August 2017 21:26:23 UTC