marko/taglibs/async/async-fragment-tag.js
2014-04-14 13:44:38 -06:00

47 lines
1.2 KiB
JavaScript

'use strict';
var raptorDataProviders = require('raptor-data-providers');
module.exports = {
render: function (input, context) {
var dataProvider = input.dataProvider;
var dataProviders = raptorDataProviders.forContext(context, false /* don't create if missing */);
var arg = input.arg || {};
arg.context = context;
var asyncContext = context.beginAsync(input.timeout);
function onError(e) {
asyncContext.error(e || 'Async fragment failed');
}
function renderBody(data) {
try {
if (input.invokeBody) {
input.invokeBody(asyncContext, data);
}
asyncContext.end();
} catch (e) {
onError(e);
}
}
var method = input.method;
if (method) {
dataProvider = dataProvider[method].bind(dataProvider);
}
try {
dataProviders.requestData(dataProvider, arg, function(err, data) {
if (err) {
return onError(err);
}
renderBody(data);
});
} catch (e) {
onError(e);
}
}
};