root / HServer / 00.Server / 00.Program / node_modules / after / README.md
이력 | 보기 | 이력해설 | 다운로드 (2.55 KB)
| 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 |