1 | # After [![Build Status][1]][2]
|
2 |
|
3 | Invoke callback after n calls
|
4 |
|
5 | ## Status: production ready
|
6 |
|
7 | ## Example
|
8 |
|
9 | ```js
|
10 | var after = require("after")
|
11 | var db = require("./db") // some db.
|
12 |
|
13 | var updateUser = function (req, res) {
|
14 | // use after to run two tasks in parallel,
|
15 | // namely get request body and get session
|
16 | // then run updateUser with the results
|
17 | var next = after(2, updateUser)
|
18 | var results = {}
|
19 |
|
20 | getJSONBody(req, res, function (err, body) {
|
21 | if (err) return next(err)
|
22 |
|
23 | results.body = body
|
24 | next(null, results)
|
25 | })
|
26 |
|
27 | getSessionUser(req, res, function (err, user) {
|
28 | if (err) return next(err)
|
29 |
|
30 | results.user = user
|
31 | next(null, results)
|
32 | })
|
33 |
|
34 | // now do the thing!
|
35 | function updateUser(err, result) {
|
36 | if (err) {
|
37 | res.statusCode = 500
|
38 | return res.end("Unexpected Error")
|
39 | }
|
40 |
|
41 | if (!result.user || result.user.role !== "admin") {
|
42 | res.statusCode = 403
|
43 | return res.end("Permission Denied")
|
44 | }
|
45 |
|
46 | db.put("users:" + req.params.userId, result.body, function (err) {
|
47 | if (err) {
|
48 | res.statusCode = 500
|
49 | return res.end("Unexpected Error")
|
50 | }
|
51 |
|
52 | res.statusCode = 200
|
53 | res.end("Ok")
|
54 | })
|
55 | }
|
56 | }
|
57 | ```
|
58 |
|
59 | ## Naive Example
|
60 |
|
61 | ```js
|
62 | var after = require("after")
|
63 | , next = after(3, logItWorks)
|
64 |
|
65 | next()
|
66 | next()
|
67 | next() // it works
|
68 |
|
69 | function logItWorks() {
|
70 | console.log("it works!")
|
71 | }
|
72 | ```
|
73 |
|
74 | ## Example with error handling
|
75 |
|
76 | ```js
|
77 | var after = require("after")
|
78 | , next = after(3, logError)
|
79 |
|
80 | next()
|
81 | next(new Error("oops")) // logs oops
|
82 | next() // does nothing
|
83 |
|
84 | // This callback is only called once.
|
85 | // If there is an error the callback gets called immediately
|
86 | // this avoids the situation where errors get lost.
|
87 | function logError(err) {
|
88 | console.log(err)
|
89 | }
|
90 | ```
|
91 |
|
92 | ## Installation
|
93 |
|
94 | `npm install after`
|
95 |
|
96 | ## Tests
|
97 |
|
98 | `npm test`
|
99 |
|
100 | ## Contributors
|
101 |
|
102 | - Raynos
|
103 | - defunctzombie
|
104 |
|
105 | ## MIT Licenced
|
106 |
|
107 | [1]: https://secure.travis-ci.org/Raynos/after.png
|
108 | [2]: http://travis-ci.org/Raynos/after
|
109 | [3]: http://raynos.org/blog/2/Flow-control-in-node.js
|
110 | [4]: http://stackoverflow.com/questions/6852059/determining-the-end-of-asynchronous-operations-javascript/6852307#6852307
|
111 | [5]: http://stackoverflow.com/questions/6869872/in-javascript-what-are-best-practices-for-executing-multiple-asynchronous-functi/6870031#6870031
|
112 | [6]: http://stackoverflow.com/questions/6864397/javascript-performance-long-running-tasks/6889419#6889419
|
113 | [7]: http://stackoverflow.com/questions/6597493/synchronous-database-queries-with-node-js/6620091#6620091
|
114 | [8]: http://github.com/Raynos/iterators
|
115 | [9]: http://github.com/Raynos/composite
|