This app provides monitoring and information features for the common freifunk user and the technical stuff of a freifunk community.
Code base is taken from a TUM Practical Course project and added here to see if Freifunk Altdorf can use it.
https://www.freifunk-altdorf.de
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
61 lines
1.5 KiB
61 lines
1.5 KiB
'use strict'; |
|
|
|
var isPromise = require('is-promise'); |
|
|
|
/** |
|
* Return a function that will run a function asynchronously or synchronously |
|
* |
|
* example: |
|
* runAsync(wrappedFunction, callback)(...args); |
|
* |
|
* @param {Function} func Function to run |
|
* @param {Function} cb Callback function passed the `func` returned value |
|
* @return {Function(arguments)} Arguments to pass to `func`. This function will in turn |
|
* return a Promise (Node >= 0.12) or call the callbacks. |
|
*/ |
|
|
|
var runAsync = module.exports = function (func, cb) { |
|
cb = cb || function () {}; |
|
|
|
return function () { |
|
var async = false; |
|
var args = arguments; |
|
|
|
var promise = new Promise(function (resolve, reject) { |
|
var answer = func.apply({ |
|
async: function () { |
|
async = true; |
|
return function (err, value) { |
|
if (err) { |
|
reject(err); |
|
} else { |
|
resolve(value); |
|
} |
|
}; |
|
} |
|
}, Array.prototype.slice.call(args)); |
|
|
|
if (!async) { |
|
if (isPromise(answer)) { |
|
answer.then(resolve, reject); |
|
} else { |
|
resolve(answer); |
|
} |
|
} |
|
}); |
|
|
|
promise.then(cb.bind(null, null), cb); |
|
|
|
return promise; |
|
} |
|
}; |
|
|
|
runAsync.cb = function (func, cb) { |
|
return runAsync(function () { |
|
var args = Array.prototype.slice.call(arguments); |
|
if (args.length === func.length - 1) { |
|
args.push(this.async()); |
|
} |
|
return func.apply(this, args); |
|
}, cb); |
|
};
|
|
|