dev-api: add developer portal, OpenAPI spec, and Flatenbadet case study
- New /developers/ page with API docs, SDKs, pricing, use cases - OpenAPI 3.0 spec for Orders, Missions, Photos, Analytics - Case study: Glasskiosken i Flatenbadet — complete ROI analysis - Updated /order/ with recurring missions and frequency dropdown
This commit is contained in:
+51
@@ -0,0 +1,51 @@
|
||||
/*! run-parallel. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */
|
||||
module.exports = runParallel
|
||||
|
||||
const queueMicrotask = require('queue-microtask')
|
||||
|
||||
function runParallel (tasks, cb) {
|
||||
let results, pending, keys
|
||||
let isSync = true
|
||||
|
||||
if (Array.isArray(tasks)) {
|
||||
results = []
|
||||
pending = tasks.length
|
||||
} else {
|
||||
keys = Object.keys(tasks)
|
||||
results = {}
|
||||
pending = keys.length
|
||||
}
|
||||
|
||||
function done (err) {
|
||||
function end () {
|
||||
if (cb) cb(err, results)
|
||||
cb = null
|
||||
}
|
||||
if (isSync) queueMicrotask(end)
|
||||
else end()
|
||||
}
|
||||
|
||||
function each (i, err, result) {
|
||||
results[i] = result
|
||||
if (--pending === 0 || err) {
|
||||
done(err)
|
||||
}
|
||||
}
|
||||
|
||||
if (!pending) {
|
||||
// empty
|
||||
done(null)
|
||||
} else if (keys) {
|
||||
// object
|
||||
keys.forEach(function (key) {
|
||||
tasks[key](function (err, result) { each(key, err, result) })
|
||||
})
|
||||
} else {
|
||||
// array
|
||||
tasks.forEach(function (task, i) {
|
||||
task(function (err, result) { each(i, err, result) })
|
||||
})
|
||||
}
|
||||
|
||||
isSync = false
|
||||
}
|
||||
Reference in New Issue
Block a user