├── .gitignore ├── .jshintrc ├── .travis.yml ├── README.md ├── bin └── build.js ├── index.html ├── lib └── index.js └── package.json /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store 3 | *~ 4 | coverage 5 | test/test-bundle.js 6 | npm-debug.log 7 | dist 8 | api.md 9 | doc/global.html 10 | doc/index.html 11 | -------------------------------------------------------------------------------- /.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "curly": true, 3 | "eqeqeq": true, 4 | "immed": true, 5 | "newcap": true, 6 | "noarg": true, 7 | "sub": true, 8 | "undef": true, 9 | "unused": true, 10 | "eqnull": true, 11 | "browser": true, 12 | "node": true, 13 | "strict": true, 14 | "globalstrict": true, 15 | "white": true, 16 | "indent": 2, 17 | "maxlen": 120, 18 | "esnext": true, 19 | "predef": [ 20 | "process", 21 | "global", 22 | "require", 23 | "console", 24 | "describe", 25 | "beforeEach", 26 | "afterEach", 27 | "it" 28 | ] 29 | } -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | 3 | node_js: 4 | - "0.10" 5 | script: npm run $COMMAND 6 | before_script: 7 | - "export DISPLAY=:99.0" 8 | - "sh -e /etc/init.d/xvfb start" 9 | - "sleep 5" 10 | 11 | # Workaround for Selenium #3280 issue 12 | - "sudo sed -i 's/^127\\.0\\.0\\.1.*$/127.0.0.1 localhost/' /etc/hosts" 13 | 14 | env: 15 | global: 16 | - SELENIUM_VERSION=2.42.0 17 | matrix: 18 | - CLIENT=node COMMAND=test 19 | - CLIENT=selenium:firefox COMMAND=test 20 | - CLIENT=selenium:phantomjs COMMAND=test 21 | - COMMAND=coverage 22 | 23 | branches: 24 | only: 25 | - master 26 | - /^pull*$/ 27 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Testing Async Functions in PouchDB 2 | ===== 3 | 4 | Run this: 5 | 6 | npm install 7 | npm run build 8 | 9 | 10 | Then run: 11 | 12 | npm start 13 | 14 | Then open up http://localhost:7777 in a browser. 15 | 16 | In your console, 17 | you should see various tests being run. All of these tests are 18 | defined in `index.js` and are invoked by `index.html`. 19 | -------------------------------------------------------------------------------- /bin/build.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var inputFile = "./lib/index.js"; 4 | var outputFile = "./dist/async-functions-in-pouchdb.js"; 5 | var standalone = "asyncFunctionsInPouchDB"; 6 | 7 | var browserify = require("browserify"); 8 | var babelify = require("babelify"); 9 | var fs = require('fs'); 10 | 11 | browserify({ standalone: standalone }).transform(babelify.configure({ 12 | experimental: true, 13 | optional: ["runtime"] 14 | })) 15 | .require(inputFile, { entry: true }) 16 | .bundle() 17 | .on("error", function (err) { console.log("Error : " + err.message); }) 18 | .pipe(fs.createWriteStream(outputFile)); 19 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /lib/index.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | let PouchDB = require('pouchdb'); 4 | let db = new PouchDB('mydb'); 5 | 6 | async function demo1() { 7 | try { 8 | // put a document 9 | await db.put({_id: 'doc'}) ; 10 | } catch (err) { 11 | if (err.status !== 409) { 12 | // ignore conflict errors (i.e. the doc already exists) 13 | throw err; 14 | } 15 | } 16 | 17 | // get the doc 18 | let doc = await db.get('doc'); 19 | 20 | console.log('here is the doc', doc); 21 | } 22 | 23 | async function demo2() { 24 | // posts a doc inside a try/catch. this should throw an error 25 | async function createNewDoc() { 26 | let response = await db.put({}); 27 | return await db.get(response.id); 28 | } 29 | 30 | async function printNewDoc() { 31 | try { 32 | let doc = await createNewDoc(); 33 | console.log('posted a new doc', doc); 34 | } catch (err) { 35 | console.log('expected an error, got it', err); 36 | } 37 | } 38 | 39 | printNewDoc(); 40 | } 41 | 42 | async function demo3() { 43 | // put multiple docs in a regular for loop 44 | let docs = [{}, {}, {}]; 45 | for (let i = 0; i < docs.length; i++) { 46 | let doc = docs[i]; 47 | let result = await db.post(doc); 48 | let savedDoc = await db.get(result.id); 49 | console.log('put a new doc in a regular for loop, here it is', savedDoc); 50 | } 51 | 52 | console.log('regular for loop\'s main function finished'); 53 | } 54 | 55 | async function demo4() { 56 | // put multiple docs in a loop 57 | let docs = [{}, {}, {}]; 58 | for (let doc of docs) { 59 | let result = await db.post(doc); 60 | let savedDoc = await db.get(result.id); 61 | console.log('put a new doc in a forOf loop, here it is', savedDoc); 62 | } 63 | 64 | console.log('forOf loop\'s main function finished'); 65 | } 66 | 67 | async function demo5() { 68 | // put multiple docs in a loop 69 | let docs = [{}, {}, {}]; 70 | docs.forEach(async function (doc, i) { 71 | console.log('async forEach: starting to wait for ', i); 72 | let result = await db.post(doc); 73 | await db.get(result.id); 74 | console.log('async forEach: done waiting for', i); 75 | }); 76 | console.log('async forEach: main function finished'); 77 | } 78 | 79 | async function demo6() { 80 | try { 81 | let docs = [{}, {}, {}]; 82 | 83 | // also works: let promises = [for (doc of docs) db.post(doc)]; 84 | let promises = docs.map((doc) => db.post(doc)); 85 | 86 | let results = []; 87 | for (let promise of promises) { 88 | results.push(await promise); 89 | } 90 | 91 | console.log('posted many docs simultaneously, results are ', results); 92 | } catch (err) { 93 | console.log(err); 94 | } 95 | } 96 | 97 | async function demo7() { 98 | try { 99 | let docs = [{}, {}, {}]; 100 | 101 | // also works: let promises = [for (doc of docs) db.post(doc)]; 102 | let promises = docs.map((doc) => db.post(doc)); 103 | 104 | let results = await Promise.all(promises); 105 | 106 | console.log('posted many docs simultaneously using Promise.all, results are ', results); 107 | } catch (err) { 108 | console.log(err); 109 | } 110 | } 111 | 112 | async function demo8() { 113 | try { 114 | let docs = [{}, {}, {}]; 115 | 116 | // also works: let promises = [for (doc of docs) db.post(doc)]; 117 | let promises = docs.map((doc) => db.post(doc)); 118 | 119 | let results = await* promises; 120 | 121 | console.log('posted many docs simultaneously using await*, results are ', results); 122 | } catch (err) { 123 | console.log(err); 124 | } 125 | } 126 | 127 | 128 | module.exports = { 129 | demo1, 130 | demo2, 131 | demo3, 132 | demo4, 133 | demo5, 134 | demo6, 135 | demo7, 136 | demo8 137 | }; 138 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "async-functions-in-pouchdb", 3 | "version": "1.0.0", 4 | "description": "Testing ES7 async functions in PouchDB", 5 | "main": "lib/index.js", 6 | "author": "Nolan Lawson ", 7 | "license": "Apache", 8 | "scripts": { 9 | "build": "mkdir -p dist && node ./bin/build.js && npm run min", 10 | "min": "uglifyjs dist/async-functions-in-pouchdb.js -mc > dist/async-functions-in-pouchdb.min.js", 11 | "start": "node node_modules/http-server/bin/http-server -p 7777" 12 | }, 13 | "dependencies": { 14 | "babel-runtime": "^4.6.3", 15 | "es3ify": "^0.1.3", 16 | "http-server": "^0.8.0", 17 | "pouchdb": "^3.3.1" 18 | }, 19 | "devDependencies": { 20 | "babelify": "^5.0.3", 21 | "browserify": "^9.0.3", 22 | "uglify-js": "^2.4.16" 23 | } 24 | } 25 | --------------------------------------------------------------------------------