Skip to content

Commit

Permalink
add pitfall about async functions
Browse files Browse the repository at this point in the history
  • Loading branch information
aearly committed Nov 7, 2017
1 parent c986910 commit 9ac8612
Showing 1 changed file with 19 additions and 0 deletions.
19 changes: 19 additions & 0 deletions intro.md
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,25 @@ async.waterfall([

It is always good practice to `return callback(err, result)` whenever a callback call is not the last statement of a function.

### Using ES2017 `async` functions

Async accepts `async` functions wherever we accept a Node-style callback function. However, we do not pass them a callback, and instead use the return value and handle any promise rejections or errors thrown.

```js
async.mapLimit(files, async file => { // <- no callback!
const text = await util.promisify(fs.readFile)(dir + file, 'utf8')
const body = JSON.parse(text) // <- a parse error herre will be caught automatically
if (!(await checkValidity(body))) {
throw new Error(`${file} has invalid contents`) // <- this error will also be caught
}
return body // <- return a value!
}, (err, contents) => {
if (err) throw err
console.log(contents)
})
```

We can only detect native `async` functions, not transpiled versions (e.g. with Babel). Otherwise, you can wrap `async` functions in `async.asyncify()`.

### Binding a context to an iteratee

Expand Down

0 comments on commit 9ac8612

Please # to comment.