Async fragments and data providers working

This commit is contained in:
Patrick Steele-Idem 2014-02-06 19:24:28 -07:00
parent 910fa93156
commit 5fc68a8373
5 changed files with 54 additions and 15 deletions

View File

@ -30,6 +30,8 @@
"raptor-modules": "~0.1.0-SNAPSHOT", "raptor-modules": "~0.1.0-SNAPSHOT",
"raptor-render-context": "~0.1.0-SNAPSHOT", "raptor-render-context": "~0.1.0-SNAPSHOT",
"raptor-data-providers": "~0.1.0-SNAPSHOT", "raptor-data-providers": "~0.1.0-SNAPSHOT",
"raptor-xml": "~0.1.0-SNAPSHOT",
"raptor-objects": "~0.1.0-SNAPSHOT",
"htmlparser2": "~3.4.0", "htmlparser2": "~3.4.0",
"char-props": "~0.1.5" "char-props": "~0.1.5"
}, },

View File

@ -81,6 +81,7 @@ module.exports = {
.on('error', callback); .on('error', callback);
} }
// console.log(attributes.async);
if (isTopLevelContext && attributes.async.remaining === 0) { if (isTopLevelContext && attributes.async.remaining === 0) {
context.emit('end'); context.emit('end');
} }

View File

@ -1,8 +1,14 @@
'use strict'; 'use strict';
var raptorDataProviders = require('raptor-data-providers');
module.exports = { module.exports = {
render: function (input, context) { render: function (input, context) {
var dataProvider = input.dataProvider; var dataProvider = input.dataProvider;
var dataProviders = raptorDataProviders.forContext(context, false /* don't create if missing */);
var arg = input.arg || {}; var arg = input.arg || {};
arg.context = context; arg.context = context;
context.beginAsyncFragment(function (asyncContext, asyncFragment) { context.beginAsyncFragment(function (asyncContext, asyncFragment) {
function onError(e) { function onError(e) {
@ -24,9 +30,9 @@ module.exports = {
} }
} }
try { try {
context.requestData(dataProvider, arg, function(err, data) { dataProviders.requestData(dataProvider, arg, function(err, data) {
if (err) { if (err) {
return onError(e); return onError(err);
} }
renderBody(data); renderBody(data);

View File

@ -72,7 +72,7 @@ function testRender(path, data, done, options) {
} }
describe('raptor-templates/rhtml' , function() { describe('raptor-templates/rhtml-async' , function() {
beforeEach(function(done) { beforeEach(function(done) {
// for (var k in require.cache) { // for (var k in require.cache) {
@ -88,19 +88,49 @@ describe('raptor-templates/rhtml' , function() {
done(); done();
}); });
it('should render a simple template', function(done) { it('should render a simple with async fragments correctly (1)', function(done) {
testRender('test-project/rhtml-templates/async-fragment-ordering.rhtml', {}, done, { testRender('test-project/rhtml-templates/async-fragment-ordering.rhtml', {}, done, {
dataProviders: { dataProviders: {
'D1': delayedDataProvider({delay: 100}), 'D1': delayedDataProvider(100),
'D2': delayedDataProvider({delay: 300}), 'D2': delayedDataProvider(300),
'D3': delayedDataProvider({delay: 200}), 'D3': delayedDataProvider(200),
'D4': delayedDataProvider({delay: 800}) 'D4': delayedDataProvider(800)
} }
}); });
}); });
it('should render a simple with async fragments correctly (2)', function(done) {
testRender('test-project/rhtml-templates/async-fragment-ordering.rhtml', {}, done, {
dataProviders: {
'D1': delayedDataProvider(100),
'D2': delayedDataProvider(200),
'D3': delayedDataProvider(300),
'D4': delayedDataProvider(150)
}
});
});
it('should render a simple with async fragments correctly (3)', function(done) {
testRender('test-project/rhtml-templates/async-fragment-ordering.rhtml', {}, done, {
dataProviders: {
'D1': delayedDataProvider(800),
'D2': delayedDataProvider(200),
'D3': delayedDataProvider(300),
'D4': delayedDataProvider(100)
}
});
});
it('should render a simple with async fragments correctly (4)', function(done) {
testRender('test-project/rhtml-templates/async-fragment-ordering.rhtml', {}, done, {
dataProviders: {
'D1': delayedDataProvider(800),
'D2': delayedDataProvider(300),
'D3': delayedDataProvider(200),
'D4': delayedDataProvider(100)
}
});
});
}); });

View File

@ -1,17 +1,17 @@
1 1
<async:fragment dependency="D1" var="d1"> <async:fragment data-provider="D1" var="d1">
2 2
<async:fragment dependency="D2" var="d2"> <async:fragment data-provider="D2" var="d2">
3 3
</async:fragment> </async:fragment>
4 4
<async:fragment dependency="D3" var="d3"> <async:fragment data-provider="D3" var="d3">
5 5
</async:fragment> </async:fragment>
6 6
</async:fragment> </async:fragment>
7 7
<async:fragment dependency="D4" var="d4"> <async:fragment data-provider="D4" var="d4">
8 8
</async:fragment> </async:fragment>
9 9