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-render-context": "~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",
"char-props": "~0.1.5"
},

View File

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

View File

@ -1,8 +1,14 @@
'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;
context.beginAsyncFragment(function (asyncContext, asyncFragment) {
function onError(e) {
@ -24,9 +30,9 @@ module.exports = {
}
}
try {
context.requestData(dataProvider, arg, function(err, data) {
dataProviders.requestData(dataProvider, arg, function(err, data) {
if (err) {
return onError(e);
return onError(err);
}
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) {
// for (var k in require.cache) {
@ -88,19 +88,49 @@ describe('raptor-templates/rhtml' , function() {
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, {
dataProviders: {
'D1': delayedDataProvider({delay: 100}),
'D2': delayedDataProvider({delay: 300}),
'D3': delayedDataProvider({delay: 200}),
'D4': delayedDataProvider({delay: 800})
'D1': delayedDataProvider(100),
'D2': delayedDataProvider(300),
'D3': delayedDataProvider(200),
'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
<async:fragment dependency="D1" var="d1">
<async:fragment data-provider="D1" var="d1">
2
<async:fragment dependency="D2" var="d2">
<async:fragment data-provider="D2" var="d2">
3
</async:fragment>
4
<async:fragment dependency="D3" var="d3">
<async:fragment data-provider="D3" var="d3">
5
</async:fragment>
6
</async:fragment>
7
<async:fragment dependency="D4" var="d4">
<async:fragment data-provider="D4" var="d4">
8
</async:fragment>
9