Külső szolgáltatások hívása az API()-val és a NEWAPI() driverekkel
Az API(name, schema, data, [$]) egy külső szolgáltatás egy műveletét hívja meg, a NEWAPI() pedig azt a drivert regisztrálja, amely a hívást végrehajtja, így a műveletei kódja nem függ attól, hogyan érik el a szolgáltatást (HTTP, egy könyvtár, egy sor...).
- A
NEWAPI('name', driver)anameszolgáltatás driverét regisztrálja (az'a,b'egy drivert regisztrál két névhez, aNEWAPI(driver)pedig az alapértelmezettet, adefault-ot). ANEWAPI('name', config, driver)egyconfigobjektumot is eltárol, amelyet minden hívásoptions.confignéven kap meg. - A driver egy
function(options, next). Azoptions.namea szolgáltatás, azoptions.schemaa művelet, azoptions.dataaz adat, azoptions.configpedig a konfiguráció. Válaszoljon anext(error, response)hívással. - Az
API('name', 'operation', data)egy buildert ad vissza: fejezze be a.callback($)(a válasz a$műveletnek megy), a.callback(function(err, response) {})vagy azawait ....promise($)hívással. A.configure({ key: value })az adott híváshoz hozzáad azoptions.config-hoz, a.error('text')pedig azt éri el, hogy egy üres válasz ezzel az üzenettel hibásodjon meg. - Ha a névhez nincs driver regisztrálva, a hívás
API is not initializedhibával végződik.
// The driver of a fake weather service: in a real one this would be an HTTP request
NEWAPI('weather', { unit: 'C' }, function(options, next) {
if (options.schema === 'forecast')
next(null, { city: options.data.city, temperature: 21, unit: options.config.unit, service: options.name });
else
next('Unknown operation ' + options.schema);
});exports.install = function() {
ROUTE('GET /forecast/', forecast);
ROUTE('GET /forecast-fahrenheit/', fahrenheit);
ROUTE('GET /unknown/', unknown);
ROUTE('GET /missing/', missing);
ROUTE('GET /promise/', promise);
};
function forecast($) {
API('weather', 'forecast', { city: $.query.city }).callback($);
}
function fahrenheit($) {
API('weather', 'forecast', { city: $.query.city }).configure({ unit: 'F' }).callback($);
}
function unknown($) {
API('weather', 'rain', {}).callback($);
}
function missing($) {
API('nobody', 'forecast', {}).callback($);
}
async function promise($) {
const data = await API('weather', 'forecast', { city: 'Oslo' }).promise($);
$.json({ city: data.city, same: true });
}